You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:46:19 UTC

[01/50] brooklyn-library git commit: Convert JavaWebAppService to java, from groovy

Repository: brooklyn-library
Updated Branches:
  refs/heads/0.5.0 [created] 0e094fa8b


Convert JavaWebAppService to java, from groovy


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/09491e01
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/09491e01
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/09491e01

Branch: refs/heads/0.5.0
Commit: 09491e01628359663dbf1c09051e0a03dcf3b4dd
Parents: 0a14db8
Author: Aled Sage <al...@gmail.com>
Authored: Tue Mar 26 17:22:02 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 07:36:23 2013 +0000

----------------------------------------------------------------------
 .../MovableElasticWebAppCluster.java            |  3 ++-
 .../entity/webapp/JavaWebAppService.groovy      | 19 ----------------
 .../entity/webapp/JavaWebAppService.java        | 24 ++++++++++++++++++++
 3 files changed, 26 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/09491e01/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
index fc2f76b..95d74fa 100644
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
+++ b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
@@ -2,6 +2,7 @@ package brooklyn.example.cloudfoundry;
 
 import java.util.Collection;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Description;
@@ -21,7 +22,7 @@ public interface MovableElasticWebAppCluster extends Entity, Startable, MovableE
     // either by passing (war: "classpath://...") in the constructor or by setConfig(ROOT_WAR).
     // as a config variable, it will be inherited by children, so the children web app entities will pick it up.
     @SetFromFlag("war")
-    public static final BasicConfigKey<String> ROOT_WAR = JavaWebAppService.ROOT_WAR;
+    public static final ConfigKey<String> ROOT_WAR = JavaWebAppService.ROOT_WAR;
     
     @SetFromFlag("ttl")
     public static final BasicConfigKey<Long> TIME_TO_LIVE_SECONDS = new BasicConfigKey<Long>(

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/09491e01/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.groovy b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.groovy
deleted file mode 100644
index 255e56c..0000000
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.groovy
+++ /dev/null
@@ -1,19 +0,0 @@
-package brooklyn.entity.webapp
-
-import brooklyn.entity.java.UsesJava
-import brooklyn.event.basic.BasicConfigKey
-import brooklyn.util.flags.SetFromFlag
-
-interface JavaWebAppService extends WebAppService, UsesJava {
-
-	@SetFromFlag("war")
-	public static final BasicConfigKey<String> ROOT_WAR = [ String, "wars.root", "WAR file to deploy as the ROOT, as URL (supporting file: and classpath: prefixes)" ]
-
-    @SetFromFlag("wars")
-	public static final BasicConfigKey<List<String>> NAMED_WARS = [ List, "wars.named", 
-        "Archive files to deploy, as URL strings (supporting file: and classpath: prefixes); context (path in user-facing URL) will be inferred by name" ]
-    
-    @SetFromFlag("warsByContext")
-    public static final BasicConfigKey<Map<String,String>> WARS_BY_CONTEXT = [ Map, "wars.by.context",
-        "Map of context keys (path in user-facing URL, typically without slashes) to archives (e.g. WARs by URL) to deploy, supporting file: and classpath: prefixes)" ]
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/09491e01/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.java b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.java
new file mode 100644
index 0000000..383c8d8
--- /dev/null
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppService.java
@@ -0,0 +1,24 @@
+package brooklyn.entity.webapp;
+
+import java.util.List;
+import java.util.Map;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.java.UsesJava;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+public interface JavaWebAppService extends WebAppService, UsesJava {
+
+	@SetFromFlag("war")
+	public static final ConfigKey<String> ROOT_WAR = new BasicConfigKey<String>(
+	        String.class, "wars.root", "WAR file to deploy as the ROOT, as URL (supporting file: and classpath: prefixes)");
+
+    @SetFromFlag("wars")
+	public static final ConfigKey<List<String>> NAMED_WARS = new BasicConfigKey(
+	        List.class, "wars.named", "Archive files to deploy, as URL strings (supporting file: and classpath: prefixes); context (path in user-facing URL) will be inferred by name");
+    
+    @SetFromFlag("warsByContext")
+    public static final ConfigKey<Map<String,String>> WARS_BY_CONTEXT = new BasicConfigKey(
+            Map.class, "wars.by.context", "Map of context keys (path in user-facing URL, typically without slashes) to archives (e.g. WARs by URL) to deploy, supporting file: and classpath: prefixes)");
+}


[25/50] brooklyn-library git commit: Increased startup delay to five minutes (300 seconds) - Added the 'startTimeout' flag and config key to each entity interface; is this really required?

Posted by he...@apache.org.
Increased startup delay to five minutes (300 seconds)
- Added the 'startTimeout' flag and config key to each entity interface; is this really required?


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/9cbbe5eb
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/9cbbe5eb
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/9cbbe5eb

Branch: refs/heads/0.5.0
Commit: 9cbbe5ebc68aac406ab9cb3c3e6756e4afe64af5
Parents: df84b66
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Mar 21 03:02:38 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java  | 3 +++
 .../java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java   | 4 ++++
 .../main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java | 4 ++++
 .../java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java    | 3 +++
 .../brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java     | 5 +++++
 5 files changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/9cbbe5eb/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
index 33cb7e0..e17f0de 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -31,6 +31,9 @@ import brooklyn.util.flags.SetFromFlag;
 @ImplementedBy(KafkaBrokerImpl.class)
 public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Kafka {
 
+    @SetFromFlag("startTimeout")
+    public static final ConfigKey<Integer> START_TIMEOUT = SoftwareProcess.START_TIMEOUT;
+
     @SetFromFlag("version")
     BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/9cbbe5eb/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index 4dd253e..0dedf9c 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -92,6 +92,10 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;
 
+    /** Wait for five minutes to start. */
+    @Override
+    public void waitForServiceUp() { waitForServiceUp(5, TimeUnit.MINUTES); }
+
     @Override
     public void waitForServiceUp(long duration, TimeUnit units) {
         super.waitForServiceUp(duration, units);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/9cbbe5eb/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
index 45843f3..65ed272 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
@@ -20,6 +20,7 @@ import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.ConfigurableEntityFactory;
+import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.group.Cluster;
 import brooklyn.entity.group.DynamicCluster;
 import brooklyn.entity.proxying.BasicEntitySpec;
@@ -89,6 +90,9 @@ public interface KafkaCluster extends Entity, Startable, Resizable  {
         }
     }
 
+    @SetFromFlag("startTimeout")
+    public static final ConfigKey<Integer> START_TIMEOUT = ConfigKeys.START_TIMEOUT;
+
     @SetFromFlag("initialSize")
     public static ConfigKey<Integer> INITIAL_SIZE = new BasicConfigKey<Integer>(Cluster.INITIAL_SIZE, 1);
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/9cbbe5eb/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
index a1001f3..522828f 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
@@ -29,6 +29,9 @@ import brooklyn.util.flags.SetFromFlag;
 @ImplementedBy(KafkaZookeeperImpl.class)
 public interface KafkaZookeeper extends SoftwareProcess, UsesJmx, Kafka {
 
+    @SetFromFlag("startTimeout")
+    public static final ConfigKey<Integer> START_TIMEOUT = SoftwareProcess.START_TIMEOUT;
+
     @SetFromFlag("version")
     BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/9cbbe5eb/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
index 0554011..00f892b 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -39,6 +39,7 @@ import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Functions;
 import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Stopwatch;
 import com.google.common.collect.Sets;
 
 /**
@@ -75,6 +76,10 @@ public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZook
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;
 
+    /** Wait for five minutes to start. */
+    @Override
+    public void waitForServiceUp() { waitForServiceUp(5, TimeUnit.MINUTES); }
+
     @Override
     public void waitForServiceUp(long duration, TimeUnit units) {
         super.waitForServiceUp(duration, units);


[30/50] brooklyn-library git commit: Changes based on review comments, including: - Updating to use latest 0.5.0 APIs - Adding general Zookeeper entity interface - Make KafkaCluster implement Group

Posted by he...@apache.org.
Changes based on review comments, including:
- Updating to use latest 0.5.0 APIs
- Adding general Zookeeper entity interface
- Make KafkaCluster implement Group


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/64486e44
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/64486e44
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/64486e44

Branch: refs/heads/0.5.0
Commit: 64486e44f0cf633f7306718ec85cdaebcb3a2435
Parents: 9825780
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Mon Apr 1 19:00:44 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../java/brooklyn/demo/KafkaClusterExample.java |  10 +-
 .../brooklyn/demo/SimpleCassandraCluster.java   |   2 +-
 .../brooklyn/demo/SimpleCouchDBCluster.java     |   2 +-
 .../java/brooklyn/demo/SimpleRedisCluster.java  |   2 +-
 .../kafka/AbstractfKafkaSshDriver.java          |   2 +-
 .../entity/messaging/kafka/KafkaBroker.java     |  12 +-
 .../entity/messaging/kafka/KafkaBrokerImpl.java |  78 ++++------
 .../messaging/kafka/KafkaBrokerSshDriver.java   |   2 +-
 .../entity/messaging/kafka/KafkaCluster.java    |  83 +++--------
 .../messaging/kafka/KafkaClusterImpl.java       | 122 ++++++++--------
 .../entity/messaging/kafka/KafkaZookeeper.java  |  28 ++--
 .../messaging/kafka/KafkaZookeeperImpl.java     | 100 +------------
 .../kafka/KafkaZookeeperSshDriver.java          |   2 +-
 .../entity/zookeeper/AbstractZookeeperImpl.java | 122 ++++++++++++++++
 .../brooklyn/entity/zookeeper/Zookeeper.java    |  50 +++++++
 .../activemq/ActiveMQIntegrationTest.groovy     |  10 +-
 .../messaging/kafka/KafkaIntegrationTest.groovy | 126 ----------------
 .../messaging/kafka/KafkaIntegrationTest.java   | 144 +++++++++++++++++++
 .../entity/messaging/kafka/KafkaSupport.java    |  24 +++-
 19 files changed, 487 insertions(+), 434 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
index fae6bb6..06bbbed 100644
--- a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
+++ b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
@@ -5,7 +5,7 @@ import java.util.List;
 import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.messaging.kafka.KafkaCluster;
-import brooklyn.entity.proxying.BasicEntitySpec;
+import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.launcher.BrooklynLauncher;
 import brooklyn.util.CommandLineUtil;
 
@@ -18,10 +18,10 @@ public class KafkaClusterExample extends ApplicationBuilder {
 
     /** Configure the application. */
     protected void doBuild() {
-        createChild(BasicEntitySpec.newInstance(KafkaCluster.class)
+        addChild(EntitySpecs.spec(KafkaCluster.class)
+                .configure("startTimeout", 300) // 5 minutes
                 .configure("initialSize", 2));
-
-        appDisplayName("Kafka cluster application");
+        // TODO set application display name?
     }
 
     public static void main(String[] argv) {
@@ -30,7 +30,7 @@ public class KafkaClusterExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new KafkaClusterExample())
+                .application(new KafkaClusterExample().appDisplayName("Kafka cluster application"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCassandraCluster.java
----------------------------------------------------------------------
diff --git a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCassandraCluster.java b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCassandraCluster.java
index 50c62a8..b538ec7 100644
--- a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCassandraCluster.java
+++ b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCassandraCluster.java
@@ -24,7 +24,7 @@ public class SimpleCassandraCluster extends ApplicationBuilder {
 
     /** Create entities. */
     protected void doBuild() {
-        createChild(EntitySpecs.spec(CassandraCluster.class)
+        addChild(EntitySpecs.spec(CassandraCluster.class)
                 .configure("initialSize", "2")
                 .configure("clusterName", "Brooklyn")
                 .configure("jmxPort", "11099+")

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCouchDBCluster.java
----------------------------------------------------------------------
diff --git a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCouchDBCluster.java b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCouchDBCluster.java
index 179443e..5de676b 100644
--- a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCouchDBCluster.java
+++ b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleCouchDBCluster.java
@@ -24,7 +24,7 @@ public class SimpleCouchDBCluster extends ApplicationBuilder {
 
     /** Create entities. */
     protected void doBuild() {
-        createChild(EntitySpecs.spec(CouchDBCluster.class)
+        addChild(EntitySpecs.spec(CouchDBCluster.class)
                 .configure("initialSize", "2")
                 .configure("clusterName", "Brooklyn")
                 .configure("httpPort", "8000+"));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleRedisCluster.java
----------------------------------------------------------------------
diff --git a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleRedisCluster.java b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleRedisCluster.java
index da80e39..0f818f5 100644
--- a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleRedisCluster.java
+++ b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/SimpleRedisCluster.java
@@ -24,7 +24,7 @@ public class SimpleRedisCluster extends ApplicationBuilder {
 
     /** Create entities. */
     protected void doBuild() {
-        createChild(EntitySpecs.spec(RedisCluster.class)
+        addChild(EntitySpecs.spec(RedisCluster.class)
                 .configure("initialSize", "2")
                 .configure("clusterName", "Brooklyn"));
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
index f6c7c8d..21e7092 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
 import brooklyn.BrooklynVersion;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.basic.lifecycle.CommonCommands;
+import brooklyn.util.ssh.CommonCommands;
 import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
index 2a82b13..c2d7632 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -20,6 +20,7 @@ import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.messaging.MessageBroker;
 import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.entity.zookeeper.Zookeeper;
 import brooklyn.event.AttributeSensor;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicConfigKey;
@@ -42,12 +43,13 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
     PortAttributeSensorAndConfigKey KAFKA_PORT = new PortAttributeSensorAndConfigKey("kafka.port", "Kafka port", "9092+");
 
     /** Location of the configuration file template to be copied to the server.*/
-    @SetFromFlag("serverConfig")
-    ConfigKey<String> SERVER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
-            String.class, "kafka.broker.configTemplate", "Server configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/server.properties");
+    @SetFromFlag("kafkaServerConfig")
+    ConfigKey<String> KAFKA_BROKER_CONFIG_TEMPLATE = new BasicConfigKey<String>(String.class,
+            "kafka.broker.configTemplate", "Kafka broker configuration template (in freemarker format)",
+            "classpath://brooklyn/entity/messaging/kafka/server.properties");
 
     @SetFromFlag("zookeeper")
-    ConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "kafka.broker.zookeeper", "Kafka zookeeper entity");
+    ConfigKey<Zookeeper> ZOOKEEPER = new BasicConfigKey<Zookeeper>(Zookeeper.class, "kafka.broker.zookeeper", "Kafka zookeeper entity");
 
     AttributeSensor<Integer> BROKER_ID = new BasicAttributeSensor<Integer>(Integer.class, "kafka.broker.id", "Kafka unique broker ID");
 
@@ -66,6 +68,6 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
 
     Integer getBrokerId();
 
-    KafkaZookeeper getZookeeper();
+    Zookeeper getZookeeper();
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index 0dedf9c..5f8add8 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -15,11 +15,7 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import java.io.IOException;
-import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
 import javax.management.ObjectName;
@@ -31,23 +27,24 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.entity.messaging.MessageBroker;
-import brooklyn.event.feed.function.FunctionFeed;
-import brooklyn.event.feed.function.FunctionPollConfig;
+import brooklyn.entity.zookeeper.Zookeeper;
 import brooklyn.event.feed.jmx.JmxAttributePollConfig;
 import brooklyn.event.feed.jmx.JmxFeed;
 import brooklyn.event.feed.jmx.JmxHelper;
 import brooklyn.util.MutableMap;
-import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Functions;
 import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.collect.Sets;
 
 /**
  * An {@link brooklyn.entity.Entity} that represents a single Kafka broker instance.
  */
 public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroker, KafkaBroker {
+
     private static final Logger log = LoggerFactory.getLogger(KafkaBrokerImpl.class);
+    private static final ObjectName SOCKET_SERVER_STATS_MBEAN = JmxHelper.createObjectName("kafka:type=kafka.SocketServerStats");
+
+    private volatile JmxFeed jmxFeed;
 
     public KafkaBrokerImpl() {
         super();
@@ -63,7 +60,7 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
     }
 
     @Override
-    public void postConstruct() {
+    public void init() {
         setAttribute(BROKER_ID, Math.abs(hashCode())); // Must be positive for partitioning to work
     }
 
@@ -74,7 +71,7 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
     public Integer getBrokerId() { return getAttribute(BROKER_ID); }
 
     @Override
-    public KafkaZookeeper getZookeeper() { return getConfig(ZOOKEEPER); }
+    public Zookeeper getZookeeper() { return getConfig(ZOOKEEPER); }
 
     public KafkaTopic createTopic(Map<?, ?> properties) {
         KafkaTopic result = new KafkaTopic(properties, this);
@@ -88,98 +85,85 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
         return KafkaBrokerDriver.class;
     }
 
-    private ObjectName socketServerStatsMbean = JmxHelper.createObjectName("kafka:type=kafka.SocketServerStats");
-    private volatile FunctionFeed functionFeed;
-    private volatile JmxFeed jmxFeed;
-
-    /** Wait for five minutes to start. */
-    @Override
-    public void waitForServiceUp() { waitForServiceUp(5, TimeUnit.MINUTES); }
-
     @Override
     public void waitForServiceUp(long duration, TimeUnit units) {
         super.waitForServiceUp(duration, units);
 
         // Wait for the MBean to exist
-        JmxHelper helper = null;
+        JmxHelper helper = new JmxHelper(this);
         try {
-            helper = new JmxHelper(this);
-            helper.connect();
-            helper.assertMBeanExistsEventually(socketServerStatsMbean, units.toMillis(duration));
-        } catch (IOException e) {
-            throw Exceptions.propagate(e);
+            helper.assertMBeanExistsEventually(SOCKET_SERVER_STATS_MBEAN, units.toMillis(duration));
         } finally {
-            if (helper != null) helper.disconnect();
+            helper.disconnect();
         }
     }
 
     @Override
     protected void connectSensors() {
-        functionFeed = FunctionFeed.builder()
-                .entity(this)
-                .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)
-                        .period(500, TimeUnit.MILLISECONDS)
-                        .callable(new Callable<Boolean>() {
-                            public Boolean call() throws Exception {
-                                return getDriver().isRunning();
-                            }
-                        })
-                        .onError(Functions.constant(Boolean.FALSE)))
-                .build();
+        connectServiceUpIsRunning();
 
         jmxFeed = JmxFeed.builder()
                 .entity(this)
                 .period(500, TimeUnit.MILLISECONDS)
                 .pollAttribute(new JmxAttributePollConfig<Long>(FETCH_REQUEST_COUNT)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("NumFetchRequests")
                         .onError(Functions.constant(-1l)))
                 .pollAttribute(new JmxAttributePollConfig<Long>(TOTAL_FETCH_TIME)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("TotalFetchRequestMs")
                         .onError(Functions.constant(-1l)))
                 .pollAttribute(new JmxAttributePollConfig<Double>(MAX_FETCH_TIME)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("MaxFetchRequestMs")
                         .onError(Functions.constant(-1.0d)))
                 .pollAttribute(new JmxAttributePollConfig<Long>(PRODUCE_REQUEST_COUNT)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("NumProduceRequests")
                         .onError(Functions.constant(-1l)))
                 .pollAttribute(new JmxAttributePollConfig<Long>(TOTAL_PRODUCE_TIME)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("TotalProduceRequestMs")
                         .onError(Functions.constant(-1l)))
                 .pollAttribute(new JmxAttributePollConfig<Double>(MAX_PRODUCE_TIME)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("MaxProduceRequestMs")
                         .onError(Functions.constant(-1.0d)))
                 .pollAttribute(new JmxAttributePollConfig<Long>(BYTES_RECEIVED)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("TotalBytesRead")
                         .onError(Functions.constant(-1l)))
                 .pollAttribute(new JmxAttributePollConfig<Long>(BYTES_SENT)
-                        .objectName(socketServerStatsMbean)
+                        .objectName(SOCKET_SERVER_STATS_MBEAN)
                         .attributeName("TotalBytesWritten")
                         .onError(Functions.constant(-1l)))
                 .build();
+
+        setBrokerUrl();
     }
 
     @Override
     public void disconnectSensors() {
         super.disconnectSensors();
-        if (functionFeed != null) functionFeed.stop();
+        disconnectServiceUpIsRunning();
         if (jmxFeed != null) jmxFeed.stop();
     }
 
     @Override
     protected ToStringHelper toStringHelper() {
-        return super.toStringHelper().add("kafkaPort", getKafkaPort());
+        return super.toStringHelper()
+                .add("kafkaPort", getKafkaPort());
     }
 
+    /** Use the {@link #getZookeeper() zookeeper} details if available, otherwise use our own host and port. */
     @Override
     public void setBrokerUrl() {
-        // TODO
+        Zookeeper zookeeper = getZookeeper();
+        if (zookeeper != null) {
+            setAttribute(BROKER_URL, String.format("zookeeper://%s:%d", zookeeper.getAttribute(HOSTNAME), zookeeper.getZookeeperPort()));
+        } else {
+            setAttribute(BROKER_URL, String.format("kafka://%s:%d", getAttribute(HOSTNAME), getKafkaPort()));
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
index 40e7234..40df6b4 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
@@ -34,7 +34,7 @@ public class KafkaBrokerSshDriver extends AbstractfKafkaSshDriver implements Kaf
 
     @Override
     protected ConfigKey<String> getConfigTemplateKey() {
-        return KafkaBroker.SERVER_CONFIG_TEMPLATE;
+        return KafkaBroker.KAFKA_BROKER_CONFIG_TEMPLATE;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
index 96e46ff..d1e123a 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
@@ -18,16 +18,15 @@ package brooklyn.entity.messaging.kafka;
 import brooklyn.catalog.Catalog;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.ConfigurableEntityFactory;
+import brooklyn.entity.Group;
 import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.group.Cluster;
 import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.proxying.BasicEntitySpec;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.proxying.ImplementedBy;
 import brooklyn.entity.trait.Resizable;
 import brooklyn.entity.trait.Startable;
+import brooklyn.entity.zookeeper.Zookeeper;
 import brooklyn.event.AttributeSensor;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
@@ -35,93 +34,53 @@ import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.util.flags.SetFromFlag;
 
 /**
- * This entity contains the sub-groups and entities that go in to a single location (e.g. datacenter)
- * to provide Kafka cluster functionality.
+ * Provides Kafka cluster functionality through a group of {@link KafkaBroker brokers} controlled
+ * by a single {@link KafkaZookeeper zookeeper} entity.
  * <p>
- * You can customise the broker by customising the factory (by reference in calling code)
- * or supplying your own factory (as a config flag).
+ * You can customise the Kafka zookeeper and brokers by supplying {@link EntitySpec entity specifications}
+ * to be used when creating them. An existing {@link Zookeeper} entity may also be provided instead of the
+ * Kafka zookeeper.
  * <p>
- * The contents of this group entity are:
+ * The contents of this entity are:
  * <ul>
  * <li>a {@link brooklyn.entity.group.DynamicCluster} of {@link KafkaBroker}s
- * <li>a {@link KafkaZookeeper}
- * <li>a {@link brooklyn.policy.Policy} to resize the DynamicCluster
+ * <li>a {@link KafkaZookeeper} or {@link Zookeeper}
+ * <li>a {@link brooklyn.policy.Policy} to resize the broker cluster
  * </ul>
+ * The {@link Group group} and {@link Resizable} interface methods are delegated to the broker cluster, so calling
+ * {@link Resizable#resize(Integer) resize} will change the number of brokers.
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
 @Catalog(name="Kafka", description="Apache Kafka is a distributed publish-subscribe messaging system")
 @ImplementedBy(KafkaClusterImpl.class)
-public interface KafkaCluster extends Entity, Startable, Resizable  {
-
-    class Spec<T extends KafkaCluster, S extends Spec<T,S>> extends BasicEntitySpec<T,S> {
-
-        private static class ConcreteSpec extends Spec<KafkaCluster, ConcreteSpec> {
-            ConcreteSpec() {
-                super(KafkaCluster.class);
-            }
-        }
-
-        public static Spec<KafkaCluster, ?> newInstance() {
-            return new ConcreteSpec();
-        }
-
-        protected Spec(Class<T> type) {
-            super(type);
-        }
-
-        public S initialSize(int val) {
-            configure(INITIAL_SIZE, val);
-            return self();
-        }
-
-        public S zookeeper(KafkaZookeeper val) {
-            configure(ZOOKEEPER, val);
-            return self();
-        }
-
-        public S brokerSpec(EntitySpec<KafkaBroker> val) {
-            configure(BROKER_SPEC, val);
-            return self();
-        }
-
-        public S brokerFactory(ConfigurableEntityFactory<KafkaBroker> val) {
-            configure(BROKER_FACTORY, val);
-            return self();
-        }
-    }
+public interface KafkaCluster extends Entity, Startable, Resizable, Group  {
 
     @SetFromFlag("startTimeout")
-    public static final ConfigKey<Integer> START_TIMEOUT = ConfigKeys.START_TIMEOUT;
+    ConfigKey<Integer> START_TIMEOUT = ConfigKeys.START_TIMEOUT;
 
     @SetFromFlag("initialSize")
     ConfigKey<Integer> INITIAL_SIZE = new BasicConfigKey<Integer>(Cluster.INITIAL_SIZE, 1);
 
+    /** Zookeeper for the cluster. If null a default be will created. */
     @SetFromFlag("zookeeper")
-    BasicAttributeSensorAndConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicAttributeSensorAndConfigKey<KafkaZookeeper>(
-            KafkaZookeeper.class, "kafka.cluster.zookeeper", "Kafka zookeeper for the cluster; if null a default will created");
+    BasicAttributeSensorAndConfigKey<Zookeeper> ZOOKEEPER = new BasicAttributeSensorAndConfigKey<Zookeeper>(
+            Zookeeper.class, "kafka.cluster.zookeeper", "The zookeeper for the cluster; if null a default be will created");
 
+    /** Spec for creating the default Kafka zookeeper entity. */
     @SetFromFlag("zookeeperSpec")
     BasicAttributeSensorAndConfigKey<EntitySpec<KafkaZookeeper>> ZOOKEEPER_SPEC = new BasicAttributeSensorAndConfigKey(
             EntitySpec.class, "kafka.cluster.zookeeperSpec", "Spec for creating the kafka zookeeper");
 
-    /** Factory to create a Kafka broker, given flags */
-    @SetFromFlag("brokerFactory")
-    BasicAttributeSensorAndConfigKey<ConfigurableEntityFactory<KafkaBroker>> BROKER_FACTORY = new BasicAttributeSensorAndConfigKey(
-            ConfigurableEntityFactory.class, "kafka.cluster.brokerFactory", "Factory to create a Kafka broker");
-
-    /** Spec for Kafka broker entiites to be created */
+    /** Spec for Kafka broker entities to be created. */
     @SetFromFlag("brokerSpec")
     BasicAttributeSensorAndConfigKey<EntitySpec<KafkaBroker>> BROKER_SPEC = new BasicAttributeSensorAndConfigKey(
             EntitySpec.class, "kafka.cluster.brokerSpec", "Spec for Kafka broker entiites to be created");
 
+    /** Underlying Kafka broker cluster. */
     AttributeSensor<DynamicCluster> CLUSTER = new BasicAttributeSensor<DynamicCluster>(
             DynamicCluster.class, "kafka.cluster.brokerCluster", "Underlying Kafka broker cluster");
 
-    AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME;
-
-    KafkaZookeeper getZookeeper();
-
-    ConfigurableEntityFactory<KafkaBroker> getBrokerFactory();
+    Zookeeper getZookeeper();
 
     DynamicCluster getCluster();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
index efc14fc..1938efa 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
@@ -18,7 +18,6 @@ package brooklyn.entity.messaging.kafka;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ExecutionException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,19 +25,19 @@ import org.slf4j.LoggerFactory;
 import brooklyn.enricher.basic.SensorPropagatingEnricher;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.AbstractEntity;
-import brooklyn.entity.basic.ConfigurableEntityFactory;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.proxying.BasicEntitySpec;
 import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.proxying.WrappingEntitySpec;
+import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.entity.trait.Startable;
+import brooklyn.entity.zookeeper.Zookeeper;
 import brooklyn.event.feed.ConfigToAttributes;
 import brooklyn.location.Location;
 import brooklyn.util.MutableList;
 import brooklyn.util.MutableMap;
-import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.exceptions.CompoundRuntimeException;
 
+import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -65,104 +64,97 @@ public class KafkaClusterImpl extends AbstractEntity implements KafkaCluster {
     }
 
     @Override
-    public void postConstruct() {
-        ConfigToAttributes.apply(this, BROKER_FACTORY);
+    public void init() {
         ConfigToAttributes.apply(this, BROKER_SPEC);
         ConfigToAttributes.apply(this, ZOOKEEPER);
         ConfigToAttributes.apply(this, ZOOKEEPER_SPEC);
 
         log.debug("creating zookeeper child for {}", this);
-        KafkaZookeeper zookeeper = getAttribute(ZOOKEEPER);
+        Zookeeper zookeeper = getAttribute(ZOOKEEPER);
         if (zookeeper == null) {
             EntitySpec<KafkaZookeeper> zookeeperSpec = getAttribute(ZOOKEEPER_SPEC);
             if (zookeeperSpec == null) {
                 log.debug("creating zookeeper using default spec for {}", this);
-                zookeeperSpec = BasicEntitySpec.newInstance(KafkaZookeeper.class);
+                zookeeperSpec = EntitySpecs.spec(KafkaZookeeper.class);
                 setAttribute(ZOOKEEPER_SPEC, zookeeperSpec);
             } else {
                 log.debug("creating zookeeper using custom spec for {}", this);
             }
-            zookeeper = getEntityManager().createEntity(WrappingEntitySpec.newInstance(zookeeperSpec).parent(this));
+            zookeeper = addChild(zookeeperSpec);
             if (Entities.isManaged(this)) Entities.manage(zookeeper);
             setAttribute(ZOOKEEPER, zookeeper);
         }
 
         log.debug("creating cluster child for {}", this);
-        ConfigurableEntityFactory<KafkaBroker> brokerFactory = getAttribute(BROKER_FACTORY);
         EntitySpec<KafkaBroker> brokerSpec = getAttribute(BROKER_SPEC);
-        if (brokerFactory == null && brokerSpec == null) {
+        if (brokerSpec == null) {
             log.debug("creating default broker spec for {}", this);
-            brokerSpec = BasicEntitySpec.newInstance(KafkaBroker.class);
+            brokerSpec = EntitySpecs.spec(KafkaBroker.class);
             setAttribute(BROKER_SPEC, brokerSpec);
         }
-        // Note relies on initial_size being inherited by DynamicCluster, because key id is identical
-        // We add the zookeeper configuration to the KafkaBroker specification or factory here
-        Map<String,Object> flags;
-        if (brokerSpec != null) {
-            flags = MutableMap.<String, Object>of("memberSpec", WrappingEntitySpec.newInstance(brokerSpec).configure(KafkaBroker.ZOOKEEPER, zookeeper));
-        } else {
-            brokerFactory.configure(KafkaBroker.ZOOKEEPER, zookeeper);
-            flags = MutableMap.<String, Object>of("factory", brokerFactory);
-        }
-        DynamicCluster cluster = getEntityManager().createEntity(BasicEntitySpec.newInstance(DynamicCluster.class)
-                .parent(this)
-                .configure(flags));
+        // Relies on initialSize being inherited by DynamicCluster, because key id is identical
+        // We add the zookeeper configuration to the KafkaBroker specification here
+        DynamicCluster cluster = addChild(EntitySpecs.spec(DynamicCluster.class)
+                .configure("memberSpec", EntitySpecs.wrapSpec(brokerSpec).configure(KafkaBroker.ZOOKEEPER, zookeeper)));
         if (Entities.isManaged(this)) Entities.manage(cluster);
         setAttribute(CLUSTER, cluster);
     }
 
     @Override
-    public KafkaZookeeper getZookeeper() {
+    public Zookeeper getZookeeper() {
         return getAttribute(ZOOKEEPER);
     }
 
     @Override
-    public synchronized ConfigurableEntityFactory<KafkaBroker> getBrokerFactory() {
-        return (ConfigurableEntityFactory<KafkaBroker>) getAttribute(BROKER_FACTORY);
-    }
-
-    @Override
-    public synchronized DynamicCluster getCluster() {
+    public DynamicCluster getCluster() {
         return getAttribute(CLUSTER);
     }
 
     @Override
     public void start(Collection<? extends Location> locations) {
         if (isLegacyConstruction()) {
-            postConstruct();
+            init();
         }
 
-        if (locations.isEmpty()) locations = this.getLocations();
-        Iterables.getOnlyElement(locations); //assert just one
+        if (locations.isEmpty()) locations = getLocations();
+        Iterables.getOnlyElement(locations); // Assert just one
         addLocations(locations);
 
         List<Entity> childrenToStart = MutableList.<Entity>of(getCluster());
         // Set the KafkaZookeeper entity as child of cluster, if it does not already have a parent
         if (getZookeeper().getParent() == null) {
             addChild(getZookeeper());
-        }
-        // And only start zookeeper if we are parent
-        if (this.equals(getZookeeper().getParent())) childrenToStart.add(getZookeeper());
-        try {
-            Entities.invokeEffectorList(this, childrenToStart, Startable.START, ImmutableMap.of("locations", locations)).get();
-        } catch (InterruptedException e) {
-            throw Exceptions.propagate(e);
-        } catch (ExecutionException e) {
-            throw Exceptions.propagate(e);
-        }
+        } // And only start zookeeper if we are parent
+        if (Objects.equal(this, getZookeeper().getParent())) childrenToStart.add(getZookeeper());
+        Entities.invokeEffectorList(this, childrenToStart, Startable.START, ImmutableMap.of("locations", locations)).getUnchecked();
 
         connectSensors();
     }
 
     @Override
     public void stop() {
-        if (this.equals(getZookeeper().getParent())) {
-            getZookeeper().stop();
+        List<Exception> errors = Lists.newArrayList();
+        if (getZookeeper() != null && Objects.equal(this, getZookeeper().getParent())) {
+            try {
+                getZookeeper().stop();
+            } catch (Exception e) {
+                errors.add(e);
+            }
+        }
+        if (getCurrentSize() > 0) {
+            try {
+                getCluster().stop();
+            } catch (Exception e) {
+                errors.add(e);
+            }
         }
-        getCluster().stop();
 
-        super.getLocations().clear();
+        getLocations().clear();
         setAttribute(SERVICE_UP, false);
+
+        if (errors.size() != 0) {
+            throw new CompoundRuntimeException("Error stopping Kafka cluster", errors);
+        }
     }
 
     @Override
@@ -181,14 +173,32 @@ public class KafkaClusterImpl extends AbstractEntity implements KafkaCluster {
                 .addToEntityAndEmitAll(this);
     }
 
+    /*
+     * All Group and Resizable interface methods are delegated to the broker cluster.
+     */
+
+    /** {@inheritDoc} */
     @Override
-    public Integer resize(Integer desiredSize) {
-        return getCluster().resize(desiredSize);
-    }
+    public Collection<Entity> getMembers() { return getCluster().getMembers(); }
 
-    /** @return the current size of the group. */
-    public Integer getCurrentSize() {
-        return getCluster().getCurrentSize();
-    }
+    /** {@inheritDoc} */
+    @Override
+    public boolean hasMember(Entity member) { return getCluster().hasMember(member); }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean addMember(Entity member) { return getCluster().addMember(member); }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean removeMember(Entity member) { return getCluster().removeMember(member); }
+
+    /** {@inheritDoc} */
+    @Override
+    public Integer getCurrentSize() { return getCluster().getCurrentSize(); }
+
+    /** {@inheritDoc} */
+    @Override
+    public Integer resize(Integer desiredSize) { return getCluster().resize(desiredSize); }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
index a001a29..a0d7a46 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
@@ -17,40 +17,28 @@ package brooklyn.entity.messaging.kafka;
 
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.entity.zookeeper.Zookeeper;
 import brooklyn.event.basic.BasicConfigKey;
-import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
 import brooklyn.util.flags.SetFromFlag;
 
 /**
  * An {@link brooklyn.entity.Entity} that represents a single Kafka zookeeper instance.
  */
 @ImplementedBy(KafkaZookeeperImpl.class)
-public interface KafkaZookeeper extends SoftwareProcess, UsesJmx, Kafka {
+public interface KafkaZookeeper extends Zookeeper, Kafka {
 
     @SetFromFlag("startTimeout")
     public static final ConfigKey<Integer> START_TIMEOUT = SoftwareProcess.START_TIMEOUT;
 
+    /** The Kafka version, not the Zookeeper version. */
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
 
-    @SetFromFlag("zookeeperPort")
-    PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
-
-    /** Location of the configuration file template to be copied to the server. */
-    @SetFromFlag("zookeeperConfig")
-    ConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
-            String.class, "kafka.zookeeper.configTemplate", "Zookeeper configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");
-
-    AttributeSensor<Long> OUTSTANDING_REQUESTS = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.outstandingRequests", "Outstanding request count");
-    AttributeSensor<Long> PACKETS_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.received", "Total packets received");
-    AttributeSensor<Long> PACKETS_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.sent", "Total packets sent");
-
-    Integer getZookeeperPort();
-
-    String getHostname();
+    /** Location of the kafka configuration file template to be copied to the server. */
+    @SetFromFlag("kafkaZookeeperConfig")
+    ConfigKey<String> KAFKA_ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(String.class,
+            "kafka.zookeeper.configTemplate", "Kafka zookeeper configuration template (in freemarker format)",
+            "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
index 00f892b..79a6cf6 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -15,37 +15,22 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import java.io.IOException;
-import java.util.Collection;
 import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.TimeUnit;
-
-import javax.management.ObjectName;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Objects.ToStringHelper;
+
 import brooklyn.entity.Entity;
-import brooklyn.entity.basic.SoftwareProcessImpl;
-import brooklyn.event.feed.function.FunctionFeed;
-import brooklyn.event.feed.function.FunctionPollConfig;
-import brooklyn.event.feed.jmx.JmxAttributePollConfig;
-import brooklyn.event.feed.jmx.JmxFeed;
-import brooklyn.event.feed.jmx.JmxHelper;
+import brooklyn.entity.zookeeper.AbstractZookeeperImpl;
 import brooklyn.util.MutableMap;
-import brooklyn.util.exceptions.Exceptions;
-
-import com.google.common.base.Functions;
-import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.Sets;
 
 /**
  * An {@link brooklyn.entity.Entity} that represents a single Kafka zookeeper instance.
  */
-public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZookeeper {
+public class KafkaZookeeperImpl extends AbstractZookeeperImpl implements KafkaZookeeper {
+
     private static final Logger log = LoggerFactory.getLogger(KafkaZookeeperImpl.class);
 
     public KafkaZookeeperImpl() {
@@ -62,83 +47,8 @@ public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZook
     }
 
     @Override
-    public Integer getZookeeperPort() { return getAttribute(ZOOKEEPER_PORT); }
-
-    @Override
-    public String getHostname() { return getAttribute(HOSTNAME); }
-
-    @Override
     public Class<?> getDriverInterface() {
         return KafkaZookeeperDriver.class;
     }
 
-    private ObjectName zookeeperMbean = JmxHelper.createObjectName("org.apache.ZooKeeperService:name0=StandaloneServer_port-1");
-    private volatile FunctionFeed functionFeed;
-    private volatile JmxFeed jmxFeed;
-
-    /** Wait for five minutes to start. */
-    @Override
-    public void waitForServiceUp() { waitForServiceUp(5, TimeUnit.MINUTES); }
-
-    @Override
-    public void waitForServiceUp(long duration, TimeUnit units) {
-        super.waitForServiceUp(duration, units);
-
-        // Wait for the MBean to exist
-        JmxHelper helper = null;
-        try {
-            helper = new JmxHelper(this);
-            helper.connect();
-            helper.assertMBeanExistsEventually(zookeeperMbean, units.toMillis(duration));
-        } catch (IOException e) {
-            throw Exceptions.propagate(e);
-        } finally {
-            if (helper != null) helper.disconnect();
-        }
-    }
-
-    @Override
-    protected void connectSensors() {
-        functionFeed = FunctionFeed.builder()
-                .entity(this)
-                .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)
-                        .period(500, TimeUnit.MILLISECONDS)
-                        .callable(new Callable<Boolean>() {
-                            public Boolean call() throws Exception {
-                                return getDriver().isRunning();
-                            }
-                        })
-                        .onError(Functions.constant(Boolean.FALSE)))
-                .build();
-
-        jmxFeed = JmxFeed.builder()
-                .entity(this)
-                .period(500, TimeUnit.MILLISECONDS)
-                .pollAttribute(new JmxAttributePollConfig<Long>(OUTSTANDING_REQUESTS)
-                        .objectName(zookeeperMbean)
-                        .attributeName("OutstandingRequests")
-                        .onError(Functions.constant(-1l)))
-                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_RECEIVED)
-                        .objectName(zookeeperMbean)
-                        .attributeName("PacketsReceived")
-                        .onError(Functions.constant(-1l)))
-                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_SENT)
-                        .objectName(zookeeperMbean)
-                        .attributeName("PacketsSent")
-                        .onError(Functions.constant(-1l)))
-                .build();
-    }
-
-    @Override
-    public void disconnectSensors() {
-        super.disconnectSensors();
-        if (functionFeed != null) functionFeed.stop();
-        if (jmxFeed != null) jmxFeed.stop();
-    }
-
-    @Override
-    protected ToStringHelper toStringHelper() {
-        return super.toStringHelper().add("zookeeperPort", getZookeeperPort());
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
index a35aab6..df417e0 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
@@ -34,7 +34,7 @@ public class KafkaZookeeperSshDriver extends AbstractfKafkaSshDriver implements
 
     @Override
     protected ConfigKey<String> getConfigTemplateKey() {
-        return KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE;
+        return KafkaZookeeper.KAFKA_ZOOKEEPER_CONFIG_TEMPLATE;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/zookeeper/AbstractZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/zookeeper/AbstractZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/zookeeper/AbstractZookeeperImpl.java
new file mode 100644
index 0000000..2e2fc73
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/zookeeper/AbstractZookeeperImpl.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.zookeeper;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.event.feed.function.FunctionFeed;
+import brooklyn.event.feed.function.FunctionPollConfig;
+import brooklyn.event.feed.jmx.JmxAttributePollConfig;
+import brooklyn.event.feed.jmx.JmxFeed;
+import brooklyn.event.feed.jmx.JmxHelper;
+import brooklyn.util.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
+
+import com.google.common.base.Functions;
+import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.Sets;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Apache Zookeeper instance.
+ */
+public abstract class AbstractZookeeperImpl extends SoftwareProcessImpl implements Zookeeper {
+
+    private static final Logger log = LoggerFactory.getLogger(AbstractZookeeperImpl.class);
+    private static final ObjectName ZOOKEEPER_MBEAN = JmxHelper.createObjectName("org.apache.ZooKeeperService:name0=StandaloneServer_port-1");
+
+    private volatile JmxFeed jmxFeed;
+
+    public AbstractZookeeperImpl() {
+        super();
+    }
+    public AbstractZookeeperImpl(Map<?, ?> properties) {
+        this(properties, null);
+    }
+    public AbstractZookeeperImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public AbstractZookeeperImpl(Map<?, ?> properties, Entity parent) {
+        super(properties, parent);
+    }
+
+    @Override
+    public Integer getZookeeperPort() { return getAttribute(ZOOKEEPER_PORT); }
+
+    @Override
+    public String getHostname() { return getAttribute(HOSTNAME); }
+
+    @Override
+    public void waitForServiceUp(long duration, TimeUnit units) {
+        super.waitForServiceUp(duration, units);
+
+        // Wait for the MBean to exist
+        JmxHelper helper = new JmxHelper(this);
+        try {
+            helper.assertMBeanExistsEventually(ZOOKEEPER_MBEAN, units.toMillis(duration));
+        } finally {
+            helper.disconnect();
+        }
+    }
+
+    @Override
+    protected void connectSensors() {
+        connectServiceUpIsRunning();
+
+        jmxFeed = JmxFeed.builder()
+                .entity(this)
+                .period(500, TimeUnit.MILLISECONDS)
+                .pollAttribute(new JmxAttributePollConfig<Long>(OUTSTANDING_REQUESTS)
+                        .objectName(ZOOKEEPER_MBEAN)
+                        .attributeName("OutstandingRequests")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_RECEIVED)
+                        .objectName(ZOOKEEPER_MBEAN)
+                        .attributeName("PacketsReceived")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_SENT)
+                        .objectName(ZOOKEEPER_MBEAN)
+                        .attributeName("PacketsSent")
+                        .onError(Functions.constant(-1l)))
+                .build();
+    }
+
+    @Override
+    public void disconnectSensors() {
+        super.disconnectSensors();
+        disconnectServiceUpIsRunning();
+        if (jmxFeed != null) jmxFeed.stop();
+    }
+
+    @Override
+    protected ToStringHelper toStringHelper() {
+        return super.toStringHelper()
+                .add("zookeeperPort", getZookeeperPort());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/main/java/brooklyn/entity/zookeeper/Zookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/zookeeper/Zookeeper.java b/software/messaging/src/main/java/brooklyn/entity/zookeeper/Zookeeper.java
new file mode 100644
index 0000000..369ff61
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/zookeeper/Zookeeper.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.zookeeper;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.entity.java.UsesJmx;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Apache Zookeeper instance.
+ * <p>
+ * Currently {@code abstract} as there is no generic Zookeeper driver.
+ */
+@ImplementedBy(AbstractZookeeperImpl.class)
+public interface Zookeeper extends SoftwareProcess, UsesJmx {
+
+    @SetFromFlag("version")
+    ConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "3.3.3");
+
+    @SetFromFlag("zookeeperPort")
+    PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
+
+    AttributeSensor<Long> OUTSTANDING_REQUESTS = new BasicAttributeSensor<Long>(Long.class, "zookeeper.outstandingRequests", "Outstanding request count");
+    AttributeSensor<Long> PACKETS_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "zookeeper.packets.received", "Total packets received");
+    AttributeSensor<Long> PACKETS_SENT = new BasicAttributeSensor<Long>(Long.class, "zookeeper.packets.sent", "Total packets sent");
+
+    Integer getZookeeperPort();
+
+    String getHostname();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
index 28ff308..8733cb0 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
@@ -41,19 +41,15 @@ public class ActiveMQIntegrationTest {
     private Location testLocation
     private ActiveMQBroker activeMQ
 
-    @BeforeMethod(groups = "Integration")
+    @BeforeMethod(alwaysRun = true)
     public void setup() {
         app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation()
     }
 
-    @AfterMethod(groups = "Integration")
+    @AfterMethod(alwaysRun = true)
     public void shutdown() {
-        try {
-            if (app != null) Entities.destroyAll(app);
-        } catch (Exception e) {
-            log.warn("Error stopping entities", e);
-        }
+        if (app != null) Entities.destroyAll(app);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
deleted file mode 100644
index 2ef95c5..0000000
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2013 by Cloudsoft Corp.
- *
- * Licensed 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.messaging.kafka;
-
-import static brooklyn.test.TestUtils.*
-import static java.util.concurrent.TimeUnit.*
-import static org.testng.Assert.*
-
-import java.util.concurrent.TimeUnit
-
-import javax.jms.Connection
-import javax.jms.MessageConsumer
-import javax.jms.MessageProducer
-import javax.jms.Queue
-import javax.jms.Session
-import javax.jms.TextMessage
-
-import org.apache.activemq.ActiveMQConnectionFactory
-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.basic.ApplicationBuilder
-import brooklyn.entity.basic.Entities
-import brooklyn.entity.proxying.BasicEntitySpec
-import brooklyn.entity.trait.Startable
-import brooklyn.location.Location
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation
-import brooklyn.test.entity.TestApplication
-import brooklyn.util.internal.TimeExtras
-
-/**
- * Test the operation of the {@link ActiveMQBroker} class.
- *
- * TODO test that sensors update.
- */
-public class KafkaIntegrationTest {
-    private static final Logger log = LoggerFactory.getLogger(KafkaIntegrationTest.class)
-
-    static { TimeExtras.init() }
-
-    private TestApplication app
-    private Location testLocation
-
-    @BeforeMethod(groups = "Integration")
-    public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
-        testLocation = new LocalhostMachineProvisioningLocation()
-    }
-
-    @AfterMethod(groups = "Integration")
-    public void shutdown() {
-        if (app != null) Entities.destroyAll(app);
-    }
-
-    /**
-     * Test that we can start a zookeeper.
-     */
-    @Test(groups = "Integration")
-    public void testZookeeper() {
-        KafkaZookeeper zookeeper = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaZookeeper.class));
-
-        zookeeper.start([ testLocation ])
-        executeUntilSucceedsWithShutdown(zookeeper, timeout:600*TimeUnit.SECONDS) {
-            assertTrue zookeeper.getAttribute(Startable.SERVICE_UP)
-        }
-        assertFalse zookeeper.getAttribute(Startable.SERVICE_UP)
-    }
-
-    /**
-     * Test that we can start a  broker and zookeeper together.
-     */
-    @Test(groups = "Integration")
-    public void testBrokerPlusZookeeper() {
-        KafkaZookeeper zookeeper = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaZookeeper.class));
-        KafkaBroker broker = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaBroker.class).configure(KafkaBroker.ZOOKEEPER, zookeeper));
-
-        zookeeper.start([ testLocation ])
-        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
-            assertTrue zookeeper.getAttribute(Startable.SERVICE_UP)
-        }
-    
-        broker.start([ testLocation ])
-        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
-            assertTrue broker.getAttribute(Startable.SERVICE_UP)
-        }
-    }
-
-    /**
-     * Test that we can start a cluster with zookeeper and one broker.
-     *
-     * Connects to the zookeeper controller and tests sending and receiving messages on a topic.
-     */
-    @Test(groups = "Integration")
-    public void testSingleBrokerCluster() {
-        KafkaCluster cluster = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaCluster.class).configure(KafkaCluster.INITIAL_SIZE, 1));
-
-        cluster.start([ testLocation ])
-        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
-            assertTrue cluster.getAttribute(Startable.SERVICE_UP)
-        }
-
-        Entities.dumpInfo(cluster);
-
-        KafkaSupport support = new KafkaSupport(cluster.getZookeeper());
-        support.sendMessage("brooklyn", "TEST_MESSAGE")
-        String message = support.getMessage("brooklyn");
-        assertEquals(message, "TEST_MESSAGE");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.java
new file mode 100644
index 0000000..54f698a
--- /dev/null
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+
+import java.util.concurrent.Callable;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.messaging.activemq.ActiveMQBroker;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.entity.trait.Startable;
+import brooklyn.location.Location;
+import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
+import brooklyn.test.Asserts;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.util.MutableMap;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Test the operation of the {@link ActiveMQBroker} class.
+ *
+ * TODO test that sensors update.
+ */
+public class KafkaIntegrationTest {
+
+    private TestApplication app;
+    private Location testLocation;
+
+    @BeforeMethod(alwaysRun = true)
+    public void setup() {
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        testLocation = new LocalhostMachineProvisioningLocation();
+    }
+
+    @AfterMethod(alwaysRun = true)
+    public void shutdown() {
+        if (app != null) Entities.destroyAll(app);
+    }
+
+    /**
+     * Test that we can start a zookeeper.
+     */
+    @Test(groups = "Integration")
+    public void testZookeeper() {
+        final KafkaZookeeper zookeeper = app.createAndManageChild(EntitySpecs.spec(KafkaZookeeper.class));
+
+        zookeeper.start(ImmutableList.of(testLocation));
+        Asserts.succeedsEventually(MutableMap.of("timeout", 60000l), new Callable<Void>() {
+            @Override
+            public Void call() {
+                assertTrue(zookeeper.getAttribute(Startable.SERVICE_UP));
+                return null;
+            }
+        });
+
+        zookeeper.stop();
+        assertFalse(zookeeper.getAttribute(Startable.SERVICE_UP));
+    }
+
+    /**
+     * Test that we can start a  broker and zookeeper together.
+     */
+    @Test(groups = "Integration")
+    public void testBrokerPlusZookeeper() {
+        final KafkaZookeeper zookeeper = app.createAndManageChild(EntitySpecs.spec(KafkaZookeeper.class));
+        final KafkaBroker broker = app.createAndManageChild(EntitySpecs.spec(KafkaBroker.class).configure(KafkaBroker.ZOOKEEPER, zookeeper));
+
+        zookeeper.start(ImmutableList.of(testLocation));
+        Asserts.succeedsEventually(MutableMap.of("timeout", 60000l), new Callable<Void>() {
+            @Override
+            public Void call() {
+                assertTrue(zookeeper.getAttribute(Startable.SERVICE_UP));
+                return null;
+            }
+        });
+
+        broker.start(ImmutableList.of(testLocation));
+        Asserts.succeedsEventually(MutableMap.of("timeout", 60000l), new Callable<Void>() {
+            @Override
+            public Void call() {
+                assertTrue(broker.getAttribute(Startable.SERVICE_UP));
+                return null;
+            }
+        });
+
+        zookeeper.stop();
+        assertFalse(zookeeper.getAttribute(Startable.SERVICE_UP));
+
+        broker.stop();
+        assertFalse(broker.getAttribute(Startable.SERVICE_UP));
+    }
+
+    /**
+     * Test that we can start a cluster with zookeeper and one broker.
+     *
+     * Connects to the zookeeper controller and tests sending and receiving messages on a topic.
+     */
+    @Test(groups = "Integration")
+    public void testSingleBrokerCluster() {
+        final KafkaCluster cluster = app.createAndManageChild(EntitySpecs.spec(KafkaCluster.class));
+
+        cluster.start(ImmutableList.of(testLocation));
+        Asserts.succeedsEventually(MutableMap.of("timeout", 60000l), new Callable<Void>() {
+            @Override
+            public Void call() {
+                assertTrue(cluster.getAttribute(Startable.SERVICE_UP));
+                assertTrue(cluster.getZookeeper().getAttribute(Startable.SERVICE_UP));
+                assertEquals(cluster.getCurrentSize().intValue(), 1);
+                return null;
+            }
+        });
+
+        Entities.dumpInfo(cluster);
+
+        KafkaSupport support = new KafkaSupport(cluster);
+
+        support.sendMessage("brooklyn", "TEST_MESSAGE");
+        String message = support.getMessage("brooklyn");
+        assertEquals(message, "TEST_MESSAGE");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/64486e44/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
index d9372a9..019a65b 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
@@ -31,40 +31,54 @@ import kafka.javaapi.producer.ProducerData;
 import kafka.message.Message;
 import kafka.producer.ProducerConfig;
 import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.zookeeper.Zookeeper;
 
-import com.beust.jcommander.internal.Lists;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
+/**
+ * Kafka test framework for integration and live tests, using the Kafka Java API.
+ */
 public class KafkaSupport {
 
-    private final KafkaZookeeper zookeeper;
+    private final KafkaCluster cluster;
 
-    public KafkaSupport(KafkaZookeeper zookeeper) {
-        this.zookeeper = zookeeper;
+    public KafkaSupport(KafkaCluster cluster) {
+        this.cluster = cluster;
     }
 
+    /**
+     * Send a message to the {@link KafkaCluster} on the given topic.
+     */
     public void sendMessage(String topic, String message) {
+        Zookeeper zookeeper = cluster.getZookeeper();
         Properties props = new Properties();
         props.put("zk.connect", String.format("%s:%d", zookeeper.getAttribute(Attributes.HOSTNAME), zookeeper.getZookeeperPort()));
         props.put("serializer.class", "kafka.serializer.StringEncoder");
         ProducerConfig config = new ProducerConfig(props);
+
         Producer<String, String> producer = new Producer<String, String>(config);
         ProducerData<String, String> data = new ProducerData<String, String>(topic, message);
         producer.send(data);
         producer.close();
     }
 
+    /**
+     * Retrieve the next message on the given topic from the {@link KafkaCluster}.
+     */
     public String getMessage(String topic) {
+        Zookeeper zookeeper = cluster.getZookeeper();
         Properties props = new Properties();
         props.put("zk.connect", String.format("%s:%d", zookeeper.getAttribute(Attributes.HOSTNAME), zookeeper.getZookeeperPort()));
-        props.put("zk.connectiontimeout.ms", "1000000");
+        props.put("zk.connectiontimeout.ms", "120000"); // two minutes
         props.put("groupid", "brooklyn");
         ConsumerConfig consumerConfig = new ConsumerConfig(props);
+
         ConsumerConnector consumer = Consumer.createJavaConsumerConnector(consumerConfig);
         List<KafkaMessageStream<Message>> streams = consumer.createMessageStreams(ImmutableMap.of(topic, 1)).get(topic);
         ConsumerIterator<Message> iterator = Iterables.getOnlyElement(streams).iterator();
         Message msg = iterator.next();
+
         assertTrue(msg.isValid());
         ByteBuffer buf = msg.payload();
         byte[] data = new byte[buf.remaining()];


[33/50] brooklyn-library git commit: Merge pull request #682 from grkvlt/0.5-tomcat-version

Posted by he...@apache.org.
Merge pull request #682 from grkvlt/0.5-tomcat-version

Updated Tomcat to 7.0.39

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/1dc5a602
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/1dc5a602
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/1dc5a602

Branch: refs/heads/0.5.0
Commit: 1dc5a6026e33e50920a27f6a8356ebb1dcc7092e
Parents: 400e17f 96465a4
Author: Aled Sage <al...@gmail.com>
Authored: Fri Apr 19 04:29:35 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Apr 19 04:29:35 2013 -0700

----------------------------------------------------------------------
 .../src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------



[05/50] brooklyn-library git commit: Merge pull request #630 from aledsage/fix/LanguageUtils-deprecate

Posted by he...@apache.org.
Merge pull request #630 from aledsage/fix/LanguageUtils-deprecate

Fix WebAppIntegrationTest, and deprecate LanguageUtils

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/3d9e3cc6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/3d9e3cc6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/3d9e3cc6

Branch: refs/heads/0.5.0
Commit: 3d9e3cc61849b6e9ec75ed913b0b962f7851c3d9
Parents: 720c93c 2a28206
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 04:29:05 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 04:29:05 2013 -0700

----------------------------------------------------------------------
 .../FederatingManagementContext.groovy          |  3 ++-
 .../test/java/example/infinispan/OneA.groovy    |  2 --
 .../osgi/karaf/KarafContainerEc2LiveTest.java   |  4 ++--
 .../entity/osgi/karaf/KarafContainerTest.groovy |  6 +++---
 .../entity/webapp/WebAppIntegrationTest.groovy  | 20 ++++++++++----------
 5 files changed, 17 insertions(+), 18 deletions(-)
----------------------------------------------------------------------



[21/50] brooklyn-library git commit: New entity for Apache Kafka messaging

Posted by he...@apache.org.
New entity for Apache Kafka messaging


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/37e890c2
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/37e890c2
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/37e890c2

Branch: refs/heads/0.5.0
Commit: 37e890c2b55ffb46ddc1a1425db9fff2e9b73bb5
Parents: 74e4016
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Mar 19 18:16:01 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:06 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/messaging/kafka/Kafka.java  |  36 ++++
 .../entity/messaging/kafka/KafkaBroker.java     |  67 +++++++
 .../messaging/kafka/KafkaBrokerDriver.java      |  24 +++
 .../entity/messaging/kafka/KafkaBrokerImpl.java | 171 ++++++++++++++++
 .../messaging/kafka/KafkaBrokerSshDriver.java   | 163 ++++++++++++++++
 .../entity/messaging/kafka/KafkaCluster.java    | 124 ++++++++++++
 .../messaging/kafka/KafkaClusterImpl.java       | 194 +++++++++++++++++++
 .../entity/messaging/kafka/KafkaTopic.java      |  57 ++++++
 .../entity/messaging/kafka/KafkaZookeeper.java  |  51 +++++
 .../messaging/kafka/KafkaZookeeperDriver.java   |  24 +++
 .../messaging/kafka/KafkaZookeeperImpl.java     | 128 ++++++++++++
 .../kafka/KafkaZookeeperSshDriver.java          | 121 ++++++++++++
 .../entity/messaging/kafka/server.properties    | 120 ++++++++++++
 .../entity/messaging/kafka/zookeeper.properties |  25 +++
 .../activemq/ActiveMQIntegrationTest.groovy     |   6 +-
 .../messaging/kafka/KafkaIntegrationTest.groovy | 120 ++++++++++++
 .../entity/messaging/kafka/KafkaLiveTest.java   |  31 +++
 17 files changed, 1461 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
new file mode 100644
index 0000000..7f26f8e
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * Shared Kafka broker and zookeeper properties.
+ */
+public interface Kafka {
+
+    BasicConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "0.7.2-incubating");
+
+    @SetFromFlag("downloadUrl")
+    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
+            Attributes.DOWNLOAD_URL, "http://mirror.catn.com/pub/apache/incubator/kafka/kafka-${version}/kafka-${version}-src.tgz");
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
new file mode 100644
index 0000000..13b8d0d
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.entity.java.UsesJmx;
+import brooklyn.entity.messaging.MessageBroker;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Kafka broker instance.
+ */
+@ImplementedBy(KafkaBrokerImpl.class)
+public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Kafka {
+
+    @SetFromFlag("version")
+    BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
+
+    @SetFromFlag("kafkaPort")
+    PortAttributeSensorAndConfigKey KAFKA_PORT = new PortAttributeSensorAndConfigKey("kafka.port", "Kafka port", "9092+");
+
+    /** Location of the configuration file template to be copied to the server.*/
+    @SetFromFlag("serverConfig")
+    BasicConfigKey<String> SERVER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
+            String.class, "kafka.config.server", "Server configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/server.properties");
+
+    @SetFromFlag("zookeeper")
+    BasicConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "Kafka zookeeper entity");
+
+    AttributeSensor<Long> BROKER_ID = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.id", "Kafka unique broker ID");
+
+    BasicAttributeSensor<Long> FETCH_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.total", "Fetch request count");
+    BasicAttributeSensor<Long> TOTAL_FETCH_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.time.total", "Total fetch request processing time (millis)");
+    BasicAttributeSensor<Double> MAX_FETCH_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.fetch.time.max", "Max fetch request processing time (millis)");
+
+    BasicAttributeSensor<Long> PRODUCE_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.total", "Produce request count");
+    BasicAttributeSensor<Long> TOTAL_PRODUCE_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.time.total", "Total produce request processing time (millis)");
+    BasicAttributeSensor<Double> MAX_PRODUCE_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.produce.time.max", "Max produce request processing time (millis)");
+
+    BasicAttributeSensor<Long> BYTES_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.received", "Total bytes received");
+    BasicAttributeSensor<Long> BYTES_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.sent", "Total bytes sent");
+
+    Integer getKafkaPort();
+
+    Long getBrokerId();
+
+    KafkaZookeeper getZookeeper();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerDriver.java
new file mode 100644
index 0000000..c9caa03
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerDriver.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.basic.SoftwareProcessDriver;
+
+public interface KafkaBrokerDriver extends SoftwareProcessDriver {
+
+    Integer getKafkaPort();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
new file mode 100644
index 0000000..d76072e
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.entity.messaging.MessageBroker;
+import brooklyn.event.feed.function.FunctionFeed;
+import brooklyn.event.feed.function.FunctionPollConfig;
+import brooklyn.event.feed.jmx.JmxAttributePollConfig;
+import brooklyn.event.feed.jmx.JmxFeed;
+import brooklyn.util.MutableMap;
+
+import com.google.common.base.Functions;
+import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.collect.Sets;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Kafka broker instance.
+ */
+public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroker, KafkaBroker {
+    private static final Logger log = LoggerFactory.getLogger(KafkaBrokerImpl.class);
+
+    private static final AtomicLong brokers = new AtomicLong(0l);
+
+    public KafkaBrokerImpl() {
+        super();
+    }
+    public KafkaBrokerImpl(Map<?, ?> properties) {
+        this(properties, null);
+    }
+    public KafkaBrokerImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public KafkaBrokerImpl(Map<?, ?> properties, Entity parent) {
+        super(properties, parent);
+    }
+
+    @Override
+    public void postConstruct() {
+        setAttribute(BROKER_ID, brokers.incrementAndGet());
+    }
+
+    @Override
+    public Integer getKafkaPort() { return getAttribute(KAFKA_PORT); }
+
+    @Override
+    public Long getBrokerId() { return getAttribute(BROKER_ID); }
+
+    @Override
+    public KafkaZookeeper getZookeeper() { return getConfig(ZOOKEEPER); }
+
+    public KafkaTopic createTopic(Map properties) {
+        KafkaTopic result = new KafkaTopic(properties, this);
+        Entities.manage(result);
+        result.create();
+        return result;
+    }
+
+    @Override
+    public Class getDriverInterface() {
+        return KafkaBrokerDriver.class;
+    }
+
+    @Override
+    protected Collection<Integer> getRequiredOpenPorts() {
+        Set<Integer> ports = Sets.newLinkedHashSet(super.getRequiredOpenPorts());
+        ports.add(getAttribute(KAFKA_PORT));
+        log.debug("getRequiredOpenPorts detected expanded ports {} for {}", ports, this);
+        return ports;
+    }
+
+    private volatile FunctionFeed functionFeed;
+    private volatile JmxFeed jmxFeed;
+
+    @Override
+    protected void connectSensors() {
+        String socketServerStatsMbean = "kafka:type=kafka.SocketServerStats";
+
+        functionFeed = FunctionFeed.builder()
+                .entity(this)
+                .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)
+                        .period(500, TimeUnit.MILLISECONDS)
+                        .callable(new Callable<Boolean>() {
+                            public Boolean call() throws Exception {
+                                return getDriver().isRunning();
+                            }
+                        })
+                        .onError(Functions.constant(Boolean.FALSE)))
+                .build();
+
+        jmxFeed = JmxFeed.builder()
+                .entity(this)
+                .period(500, TimeUnit.MILLISECONDS)
+                .pollAttribute(new JmxAttributePollConfig<Long>(FETCH_REQUEST_COUNT)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("NumFetchRequests")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(TOTAL_FETCH_TIME)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("TotalFetchRequestMs")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Double>(MAX_FETCH_TIME)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("MaxFetchRequestMs")
+                        .onError(Functions.constant(-1.0d)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(PRODUCE_REQUEST_COUNT)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("NumProduceRequests")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(TOTAL_PRODUCE_TIME)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("TotalProduceRequestMs")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Double>(MAX_PRODUCE_TIME)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("MaxProduceRequestMs")
+                        .onError(Functions.constant(-1.0d)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(BYTES_RECEIVED)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("TotalBytesRead")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(BYTES_SENT)
+                        .objectName(socketServerStatsMbean)
+                        .attributeName("TotalBytesWritten")
+                        .onError(Functions.constant(-1l)))
+                .build();
+    }
+
+    @Override
+    public void disconnectSensors() {
+        super.disconnectSensors();
+        if (functionFeed != null) functionFeed.stop();
+        if (jmxFeed != null) jmxFeed.stop();
+    }
+
+    @Override
+    protected ToStringHelper toStringHelper() {
+        return super.toStringHelper().add("kafkaPort", getKafkaPort());
+    }
+
+    @Override
+    public void setBrokerUrl() {
+        // TODO
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
new file mode 100644
index 0000000..e6c9e4e
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.lang.String.format;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.BrooklynVersion;
+import brooklyn.entity.basic.lifecycle.CommonCommands;
+import brooklyn.entity.drivers.downloads.DownloadResolver;
+import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.util.MutableMap;
+import brooklyn.util.NetworkUtils;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.jmx.jmxrmi.JmxRmiAgent;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class KafkaBrokerSshDriver extends JavaSoftwareProcessSshDriver implements KafkaBrokerDriver {
+
+    private static final Logger log = LoggerFactory.getLogger(KafkaBrokerSshDriver.class);
+
+    private String expandedInstallDir;
+
+    public KafkaBrokerSshDriver(KafkaBrokerImpl entity, SshMachineLocation machine) {
+        super(entity, machine);
+    }
+
+    @Override
+    protected String getLogFileLocation() { return getRunDir()+"/kafka-log"; }
+
+    @Override
+    public Integer getKafkaPort() { return entity.getAttribute(KafkaBroker.KAFKA_PORT); }
+
+    private String getExpandedInstallDir() {
+        if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
+        return expandedInstallDir;
+    }
+
+    @Override
+    public void install() {
+        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
+        List<String> urls = resolver.getTargets();
+        String saveAs = resolver.getFilename();
+        expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));
+
+        List<String> commands = new LinkedList<String>();
+        commands.addAll(CommonCommands.downloadUrlAs(urls, saveAs));
+        commands.add(CommonCommands.INSTALL_TAR);
+        commands.add("tar xzfv "+saveAs);
+        commands.add("cd "+expandedInstallDir);
+        commands.add("./sbt update");
+        commands.add("./sbt package");
+
+        newScript(INSTALLING)
+                .failOnNonZeroResultCode()
+                .body.append(commands)
+                .execute();
+    }
+
+    @Override
+    public void customize() {
+        NetworkUtils.checkPortsValid(MutableMap.of("kafkaPort", getKafkaPort()));
+        newScript(CUSTOMIZING)
+                .failOnNonZeroResultCode()
+                .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
+                .execute();
+
+        String serverConfig = entity.getConfig(KafkaBroker.SERVER_CONFIG_TEMPLATE);
+        copyTemplate(serverConfig, "server.properties");
+
+        // Copy JMX agent Jar to server
+        getMachine().copyTo(new ResourceUtils(this).getResourceFromUrl(getJmxRmiAgentJarUrl()), getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    public String getJmxRmiAgentJarBasename() {
+        return "brooklyn-jmxrmi-agent-" + BrooklynVersion.get() + ".jar";
+    }
+
+    public String getJmxRmiAgentJarUrl() {
+        return "classpath://" + getJmxRmiAgentJarBasename();
+    }
+
+    public String getJmxRmiAgentJarDestinationFilePath() {
+        return getRunDir() + "/" + getJmxRmiAgentJarBasename();
+    }
+
+    @Override
+    public void launch() {
+        newScript(ImmutableMap.of("usePidFile", getPidFile()), LAUNCHING)
+                .failOnNonZeroResultCode()
+                .body.append("nohup ./bin/kafka-server-start.sh ./server.properties > console.out 2>&1 &")
+                .execute();
+    }
+
+    public String getPidFile() { return getRunDir() + "/kafka.pid"; }
+
+    @Override
+    public boolean isRunning() {
+        return newScript(ImmutableMap.of("usePidFile", getPidFile()), CHECK_RUNNING).execute() == 0;
+    }
+
+    @Override
+    public void stop() {
+        newScript(ImmutableMap.of("usePidFile", false), STOPPING)
+                .body.append("ps ax | grep kafka\\.Kafka | awk '{print $1}' | xargs kill")
+                .body.append("ps ax | grep kafka\\.Kafka | awk '{print $1}' | xargs kill -9")
+                .execute();
+    }
+
+    @Override
+    protected Map<String, ?> getJmxJavaSystemProperties() {
+        return MutableMap.<String, Object> builder()
+                .put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, getJmxPort())
+                .put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, getRmiServerPort())
+                .put("com.sun.management.jmxremote.ssl", false)
+                .put("com.sun.management.jmxremote.authenticate", false)
+                .put("java.rmi.server.hostname", getHostname())
+                .build();
+    }
+
+    @Override
+    protected List<String> getJmxJavaConfigOptions() {
+        return ImmutableList.of("-javaagent:" + getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    /**
+     * Use RMI agent to provide JMX.
+     */
+    @Override
+    public Map<String, String> getShellEnvironment() {
+        Map<String, String> orig = super.getShellEnvironment();
+        String kafkaJmxOpts = orig.remove("JAVA_OPTS");
+        return MutableMap.<String, String>builder()
+                .putAll(orig)
+                .put("KAFKA_JMX_OPTS", kafkaJmxOpts)
+                .build();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
new file mode 100644
index 0000000..45843f3
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.catalog.Catalog;
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.ConfigurableEntityFactory;
+import brooklyn.entity.group.Cluster;
+import brooklyn.entity.group.DynamicCluster;
+import brooklyn.entity.proxying.BasicEntitySpec;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.entity.trait.Resizable;
+import brooklyn.entity.trait.Startable;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * This entity contains the sub-groups and entities that go in to a single location (e.g. datacenter)
+ * to provide Kafka cluster functionality.
+ * <p>
+ * You can customise the broker by customising the factory (by reference in calling code)
+ * or supplying your own factory (as a config flag).
+ * <p>
+ * The contents of this group entity are:
+ * <ul>
+ * <li>a {@link brooklyn.entity.group.DynamicCluster} of {@link KafkaBroker}s
+ * <li>a {@link KafkaZookeeper}
+ * <li>a {@link brooklyn.policy.Policy} to resize the DynamicCluster
+ * </ul>
+ */
+@SuppressWarnings({ "unchecked", "rawtypes" })
+@Catalog(name="Kafka", description="Apache Kafka is a distributed publish-subscribe messaging system")
+@ImplementedBy(KafkaClusterImpl.class)
+public interface KafkaCluster extends Entity, Startable, Resizable  {
+
+    public static class Spec<T extends KafkaCluster, S extends Spec<T,S>> extends BasicEntitySpec<T,S> {
+
+        private static class ConcreteSpec extends Spec<KafkaCluster, ConcreteSpec> {
+            ConcreteSpec() {
+                super(KafkaCluster.class);
+            }
+        }
+
+        public static Spec<KafkaCluster, ?> newInstance() {
+            return new ConcreteSpec();
+        }
+
+        protected Spec(Class<T> type) {
+            super(type);
+        }
+
+        public S initialSize(int val) {
+            configure(INITIAL_SIZE, 1);
+            return self();
+        }
+
+        public S zookeeper(KafkaZookeeper val) {
+            configure(ZOOKEEPER, val);
+            return self();
+        }
+
+        public S brokerSpec(EntitySpec<KafkaBroker> val) {
+            configure(BROKER_SPEC, val);
+            return self();
+        }
+
+        public S brokerFactory(ConfigurableEntityFactory<KafkaBroker> val) {
+            configure(BROKER_FACTORY, val);
+            return self();
+        }
+    }
+
+    @SetFromFlag("initialSize")
+    public static ConfigKey<Integer> INITIAL_SIZE = new BasicConfigKey<Integer>(Cluster.INITIAL_SIZE, 1);
+
+    @SetFromFlag("controller")
+    public static BasicAttributeSensorAndConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicAttributeSensorAndConfigKey<KafkaZookeeper>(
+            KafkaZookeeper.class, "kafkacluster.zookeeper", "Kafka zookeeper for the cluster; if null a default will created");
+
+    @SetFromFlag("zookeeperSpec")
+    public static BasicAttributeSensorAndConfigKey<EntitySpec<KafkaZookeeper>> ZOOKEEPER_SPEC = new BasicAttributeSensorAndConfigKey(
+            EntitySpec.class, "kafkacluster.zookeeperSpec", "Spec for creating the kafka zookeeper");
+
+    /** Factory to create a Kafka broker, given flags */
+    @SetFromFlag("brokerFactory")
+    public static BasicAttributeSensorAndConfigKey<ConfigurableEntityFactory<KafkaBroker>> BROKER_FACTORY = new BasicAttributeSensorAndConfigKey(
+            ConfigurableEntityFactory.class, "kafkacluster.brokerFactory", "Factory to create a Kafka broker");
+
+    /** Spec for Kafka broker entiites to be created */
+    @SetFromFlag("brokerSpec")
+    public static BasicAttributeSensorAndConfigKey<EntitySpec<KafkaBroker>> BROKER_SPEC = new BasicAttributeSensorAndConfigKey(
+            EntitySpec.class, "kafkacluster.brokerSpec", "Spec for Kafka broker entiites to be created");
+
+    public static AttributeSensor<DynamicCluster> CLUSTER = new BasicAttributeSensor<DynamicCluster>(
+            DynamicCluster.class, "kafkacluster.cluster", "Underlying Kafka broker cluster");
+
+    public static final AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME;
+
+    public KafkaZookeeper getZookeeper();
+
+    public ConfigurableEntityFactory<KafkaBroker> getBrokerFactory();
+
+    public DynamicCluster getCluster();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
new file mode 100644
index 0000000..969a140
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.enricher.basic.SensorPropagatingEnricher;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.entity.basic.ConfigurableEntityFactory;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.group.DynamicCluster;
+import brooklyn.entity.proxying.BasicEntitySpec;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.entity.proxying.WrappingEntitySpec;
+import brooklyn.entity.trait.Startable;
+import brooklyn.event.feed.ConfigToAttributes;
+import brooklyn.location.Location;
+import brooklyn.util.MutableList;
+import brooklyn.util.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+/**
+ * Implementation of a Kafka cluster containing a {@link KafkaZookeeper} node and a group of {@link KafkaBroker}s.
+ */
+public class KafkaClusterImpl extends AbstractEntity implements KafkaCluster {
+
+    public static final Logger log = LoggerFactory.getLogger(KafkaClusterImpl.class);
+
+    public KafkaClusterImpl() {
+        this(MutableMap.of(), null);
+    }
+    public KafkaClusterImpl(Map<?, ?> flags) {
+        this(flags, null);
+    }
+    public KafkaClusterImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public KafkaClusterImpl(Map<?, ?> flags, Entity parent) {
+        super(flags, parent);
+        setAttribute(SERVICE_UP, false);
+    }
+
+    @Override
+    public void postConstruct() {
+        ConfigToAttributes.apply(this, BROKER_FACTORY);
+        ConfigToAttributes.apply(this, BROKER_SPEC);
+        ConfigToAttributes.apply(this, ZOOKEEPER);
+        ConfigToAttributes.apply(this, ZOOKEEPER_SPEC);
+
+        log.debug("creating zookeeper child for {}", this);
+        KafkaZookeeper zookeeper = getAttribute(ZOOKEEPER);
+        if (zookeeper == null) {
+            EntitySpec<KafkaZookeeper> zookeeperSpec = getAttribute(ZOOKEEPER_SPEC);
+            if (zookeeperSpec == null) {
+                log.debug("creating controller using default spec for {}", this);
+                zookeeperSpec = BasicEntitySpec.newInstance(KafkaZookeeper.class);
+                setAttribute(ZOOKEEPER_SPEC, zookeeperSpec);
+            } else {
+                log.debug("creating controller using custom spec for {}", this);
+            }
+            zookeeper = getEntityManager().createEntity(WrappingEntitySpec.newInstance(zookeeperSpec).parent(this));
+            if (Entities.isManaged(this)) Entities.manage(zookeeper);
+            setAttribute(ZOOKEEPER, zookeeper);
+        }
+
+        log.debug("creating cluster child for {}", this);
+        ConfigurableEntityFactory<KafkaBroker> brokerFactory = getAttribute(BROKER_FACTORY);
+        EntitySpec<KafkaBroker> brokerSpec = getAttribute(BROKER_SPEC);
+        if (brokerFactory == null && brokerSpec == null) {
+            log.debug("creating default broker spec for {}", this);
+            brokerSpec = BasicEntitySpec.newInstance(KafkaBroker.class);
+            setAttribute(BROKER_SPEC, brokerSpec);
+        }
+        // Note relies on initial_size being inherited by DynamicCluster, because key id is identical
+        // We add the zookeeper configuration to the KafkaBroker specification or factory here
+        Map<String,Object> flags;
+        if (brokerSpec != null) {
+            flags = MutableMap.<String, Object>of("memberSpec", WrappingEntitySpec.newInstance(brokerSpec).configure(KafkaBroker.ZOOKEEPER, zookeeper));
+        } else {
+            brokerFactory.configure(KafkaBroker.ZOOKEEPER, zookeeper);
+            flags = MutableMap.<String, Object>of("factory", brokerFactory);
+        }
+        DynamicCluster cluster = getEntityManager().createEntity(BasicEntitySpec.newInstance(DynamicCluster.class)
+                .parent(this)
+                .configure(flags));
+        if (Entities.isManaged(this)) Entities.manage(cluster);
+        setAttribute(CLUSTER, cluster);
+    }
+
+    @Override
+    public KafkaZookeeper getZookeeper() {
+        return getAttribute(ZOOKEEPER);
+    }
+
+    @Override
+    public synchronized ConfigurableEntityFactory<KafkaBroker> getBrokerFactory() {
+        return (ConfigurableEntityFactory<KafkaBroker>) getAttribute(BROKER_FACTORY);
+    }
+
+    @Override
+    public synchronized DynamicCluster getCluster() {
+        return getAttribute(CLUSTER);
+    }
+
+    @Override
+    public void start(Collection<? extends Location> locations) {
+        if (isLegacyConstruction()) {
+            postConstruct();
+        }
+
+        if (locations.isEmpty()) locations = this.getLocations();
+        Iterables.getOnlyElement(locations); //assert just one
+        addLocations(locations);
+
+        List<Entity> childrenToStart = MutableList.<Entity>of(getCluster());
+        // Set the KafkaZookeeper entity as child of cluster, if it does not already have a parent
+        if (getZookeeper().getParent() == null) {
+            addChild(getZookeeper());
+        }
+        // And only start zookeeper if we are parent
+        if (this.equals(getZookeeper().getParent())) childrenToStart.add(getZookeeper());
+        try {
+            Entities.invokeEffectorList(this, childrenToStart, Startable.START, ImmutableMap.of("locations", locations)).get();
+        } catch (InterruptedException e) {
+            throw Exceptions.propagate(e);
+        } catch (ExecutionException e) {
+            throw Exceptions.propagate(e);
+        }
+
+        connectSensors();
+    }
+
+    @Override
+    public void stop() {
+        if (this.equals(getZookeeper().getParent())) {
+            getZookeeper().stop();
+        }
+        getCluster().stop();
+
+        super.getLocations().clear();
+        setAttribute(SERVICE_UP, false);
+    }
+
+    @Override
+    public void restart() {
+        // TODO prod the entities themselves to restart, instead?
+        Collection<Location> locations = Lists.newArrayList(getLocations());
+
+        stop();
+        start(locations);
+    }
+
+    void connectSensors() {
+        SensorPropagatingEnricher.newInstanceListeningToAllSensorsBut(getCluster(), SERVICE_UP)
+                .addToEntityAndEmitAll(this);
+        SensorPropagatingEnricher.newInstanceListeningTo(getZookeeper(), SERVICE_UP)
+                .addToEntityAndEmitAll(this);
+    }
+
+    @Override
+    public Integer resize(Integer desiredSize) {
+        return getCluster().resize(desiredSize);
+    }
+
+    /** @return the current size of the group. */
+    public Integer getCurrentSize() {
+        return getCluster().getCurrentSize();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaTopic.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaTopic.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaTopic.java
new file mode 100644
index 0000000..5f50c6d
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaTopic.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import java.util.Map;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.entity.messaging.Topic;
+import brooklyn.util.MutableMap;
+
+public class KafkaTopic extends AbstractEntity implements Topic {
+
+    public KafkaTopic() {
+        super(MutableMap.of(), null);
+    }
+    public KafkaTopic(Map properties) {
+        super(properties, null);
+    }
+    public KafkaTopic(Entity parent) {
+        super(MutableMap.of(), parent);
+    }
+    public KafkaTopic(Map properties, Entity parent) {
+        super(properties, parent);
+    }
+
+    // kafka:type=kafka.logs.${topicName}
+
+    @Override
+    public String getTopicName() {
+        return null; // TODO
+    }
+
+    @Override
+    public void create() {
+        // TODO
+    }
+
+    @Override
+    public void delete() {
+        // TODO
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
new file mode 100644
index 0000000..8e1b5da
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.entity.java.UsesJmx;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Kafka zookeeper instance.
+ */
+@ImplementedBy(KafkaZookeeperImpl.class)
+public interface KafkaZookeeper extends SoftwareProcess, UsesJmx, Kafka {
+
+    @SetFromFlag("version")
+    BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
+
+    @SetFromFlag("zookeeperPort")
+    PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
+
+    /** Location of the configuration file template to be copied to the server.*/
+    @SetFromFlag("zookeeperConfig")
+    BasicConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
+            String.class, "kafka.config.zookeeper", "Zookeeper configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");
+
+    BasicAttributeSensor<Long> OUTSTANDING_REQUESTS = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.outstandingRequests", "Outstanding request count");
+    BasicAttributeSensor<Long> PACKETS_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.received", "Total packets received");
+    BasicAttributeSensor<Long> PACKETS_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.sent", "Total packets sent");
+
+    Integer getZookeeperPort();
+
+    String getHostname();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperDriver.java
new file mode 100644
index 0000000..ac1c8fe
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperDriver.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.basic.SoftwareProcessDriver;
+
+public interface KafkaZookeeperDriver extends SoftwareProcessDriver {
+
+    Integer getZookeeperPort();
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
new file mode 100644
index 0000000..d941411
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.entity.messaging.qpid.QpidBroker;
+import brooklyn.event.feed.function.FunctionFeed;
+import brooklyn.event.feed.function.FunctionPollConfig;
+import brooklyn.event.feed.jmx.JmxAttributePollConfig;
+import brooklyn.event.feed.jmx.JmxFeed;
+import brooklyn.util.MutableMap;
+
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.collect.Sets;
+
+/**
+ * An {@link brooklyn.entity.Entity} that represents a single Kafka zookeeper instance.
+ */
+public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZookeeper {
+    private static final Logger log = LoggerFactory.getLogger(KafkaZookeeperImpl.class);
+
+    public KafkaZookeeperImpl() {
+        super();
+    }
+    public KafkaZookeeperImpl(Map<?, ?> properties) {
+        this(properties, null);
+    }
+    public KafkaZookeeperImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public KafkaZookeeperImpl(Map<?, ?> properties, Entity parent) {
+        super(properties, parent);
+    }
+
+    @Override
+    public Integer getZookeeperPort() { return getAttribute(ZOOKEEPER_PORT); }
+
+    @Override
+    public String getHostname() { return getAttribute(HOSTNAME); }
+
+    @Override
+    public Class getDriverInterface() {
+        return KafkaZookeeperDriver.class;
+    }
+
+    @Override
+    protected Collection<Integer> getRequiredOpenPorts() {
+        Set<Integer> ports = Sets.newLinkedHashSet(super.getRequiredOpenPorts());
+        ports.add(getAttribute(ZOOKEEPER_PORT));
+        log.debug("getRequiredOpenPorts detected expanded ports {} for {}", ports, this);
+        return ports;
+    }
+
+    private volatile FunctionFeed functionFeed;
+    private volatile JmxFeed jmxFeed;
+
+    @Override
+    protected void connectSensors() {
+        String zookeeperMbean = "org.apache.ZooKeeperService:name0=StandaloneServer_port-1";
+
+        functionFeed = FunctionFeed.builder()
+                .entity(this)
+                .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)
+                        .period(500, TimeUnit.MILLISECONDS)
+                        .callable(new Callable<Boolean>() {
+                            public Boolean call() throws Exception {
+                                return getDriver().isRunning();
+                            }
+                        })
+                        .onError(Functions.constant(Boolean.FALSE)))
+                .build();
+
+        jmxFeed = JmxFeed.builder()
+                .entity(this)
+                .period(500, TimeUnit.MILLISECONDS)
+                .pollAttribute(new JmxAttributePollConfig<Long>(OUTSTANDING_REQUESTS)
+                        .objectName(zookeeperMbean)
+                        .attributeName("OutstandingRequests")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_RECEIVED)
+                        .objectName(zookeeperMbean)
+                        .attributeName("PacketsReceived")
+                        .onError(Functions.constant(-1l)))
+                .pollAttribute(new JmxAttributePollConfig<Long>(PACKETS_SENT)
+                        .objectName(zookeeperMbean)
+                        .attributeName("PacketsSent")
+                        .onError(Functions.constant(-1l)))
+                .build();
+    }
+
+    @Override
+    public void disconnectSensors() {
+        super.disconnectSensors();
+        if (functionFeed != null) functionFeed.stop();
+        if (jmxFeed != null) jmxFeed.stop();
+    }
+
+    @Override
+    protected ToStringHelper toStringHelper() {
+        return super.toStringHelper().add("zookeeperPort", getZookeeperPort());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
new file mode 100644
index 0000000..4310489
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static java.lang.String.format;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.basic.lifecycle.CommonCommands;
+import brooklyn.entity.drivers.downloads.DownloadResolver;
+import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.util.MutableMap;
+import brooklyn.util.NetworkUtils;
+
+import com.google.common.collect.ImmutableMap;
+
+public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implements KafkaZookeeperDriver {
+
+    private static final Logger log = LoggerFactory.getLogger(KafkaZookeeperSshDriver.class);
+
+    private String expandedInstallDir;
+
+    public KafkaZookeeperSshDriver(KafkaZookeeperImpl entity, SshMachineLocation machine) {
+        super(entity, machine);
+    }
+
+    @Override
+    protected String getLogFileLocation() { return getRunDir()+"/kafka-log"; }
+
+    @Override
+    public Integer getZookeeperPort() { return entity.getAttribute(KafkaZookeeper.ZOOKEEPER_PORT); }
+
+    private String getExpandedInstallDir() {
+        if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
+        return expandedInstallDir;
+    }
+
+    @Override
+    public void install() {
+        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
+        List<String> urls = resolver.getTargets();
+        String saveAs = resolver.getFilename();
+        expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));
+
+        List<String> commands = new LinkedList<String>();
+        commands.addAll(CommonCommands.downloadUrlAs(urls, saveAs));
+        commands.add(CommonCommands.INSTALL_TAR);
+        commands.add("tar xzfv "+saveAs);
+        commands.add("cd "+expandedInstallDir);
+        commands.add("./sbt update");
+        commands.add("./sbt package");
+
+        newScript(INSTALLING)
+                .failOnNonZeroResultCode()
+                .body.append(commands)
+                .execute();
+    }
+
+    @Override
+    public void customize() {
+        NetworkUtils.checkPortsValid(MutableMap.of("zookeeperPort", getZookeeperPort()));
+        newScript(CUSTOMIZING)
+                .failOnNonZeroResultCode()
+                .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
+                .execute();
+
+        String serverConfig = entity.getConfig(KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE);
+        copyTemplate(serverConfig, "zookeeper.properties");
+    }
+
+    @Override
+    public void launch() {
+        newScript(ImmutableMap.of("usePidFile", getPidFile()), LAUNCHING)
+                .failOnNonZeroResultCode()
+                .body.append("nohup ./bin/zookeeper-server-start.sh ./zookeeper.properties > console.out 2>&1 &")
+                .execute();
+    }
+
+    public String getPidFile() { return getRunDir() + "/kafka.pid"; }
+
+    @Override
+    public boolean isRunning() {
+        return newScript(ImmutableMap.of("usePidFile", getPidFile()), CHECK_RUNNING).execute() == 0;
+    }
+
+    @Override
+    public void stop() {
+        newScript(ImmutableMap.of("usePidFile", false), STOPPING)
+                .body.append("ps ax | grep quorum\\.QuorumPeerMain | awk '{print $1}' | xargs kill")
+                .body.append("ps ax | grep quorum\\.QuorumPeerMain | awk '{print $1}' | xargs kill -9")
+                .execute();
+    }
+
+    @Override
+    public Map<String, String> getShellEnvironment() {
+        Map<String, String> orig = super.getShellEnvironment();
+        return MutableMap.<String, String>builder()
+                .put("KAFKA_JMX_OPTS", orig.get("JAVA_OPTS"))
+                .build();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/server.properties
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/server.properties b/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/server.properties
new file mode 100644
index 0000000..b440076
--- /dev/null
+++ b/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/server.properties
@@ -0,0 +1,120 @@
+[#ftl]
+# Copyright 2013 by Cloudsoft Corp.
+#
+# Licensed 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.
+
+##
+# KafkaBroker configuration template for Brooklyn
+#
+# see kafka.server.KafkaConfig for additional details and defaults
+##
+
+############################# Server Basics #############################
+# The id of the broker. This must be set to a unique integer for each broker.
+brokerid=${entity.brokerId?c}
+
+# Hostname the broker will advertise to consumers. If not set, kafka will use the value returned
+# from InetAddress.getLocalHost().  If there are multiple interfaces getLocalHost
+# may not be what you want.
+hostname=${driver.hostname}
+
+
+############################# Socket Server Settings #############################
+
+# The port the socket server listens on
+port=${entity.kafkaPort?c}
+
+# The number of processor threads the socket server uses for receiving and answering requests. 
+# Defaults to the number of cores on the machine
+num.threads=8
+
+# The send buffer (SO_SNDBUF) used by the socket server
+socket.send.buffer=1048576
+
+# The receive buffer (SO_RCVBUF) used by the socket server
+socket.receive.buffer=1048576
+
+# The maximum size of a request that the socket server will accept (protection against OOM)
+max.socket.request.bytes=104857600
+
+
+############################# Log Basics #############################
+
+# The directory under which to store log files
+log.dir=${driver.runDir}/kafka-logs
+
+# The number of logical partitions per topic per server. More partitions allow greater parallelism
+# for consumption, but also mean more files.
+num.partitions=1
+
+# Overrides for for the default given by num.partitions on a per-topic basis
+#topic.partition.count.map=topic1:3, topic2:4
+
+############################# Log Flush Policy #############################
+
+# The following configurations control the flush of data to disk. This is the most
+# important performance knob in kafka.
+# There are a few important trade-offs here:
+#    1. Durability: Unflushed data is at greater risk of loss in the event of a crash.
+#    2. Latency: Data is not made available to consumers until it is flushed (which adds latency).
+#    3. Throughput: The flush is generally the most expensive operation. 
+# The settings below allow one to configure the flush policy to flush data after a period of time or
+# every N messages (or both). This can be done globally and overridden on a per-topic basis.
+
+# The number of messages to accept before forcing a flush of data to disk
+log.flush.interval=10000
+
+# The maximum amount of time a message can sit in a log before we force a flush
+log.default.flush.interval.ms=1000
+
+# Per-topic overrides for log.default.flush.interval.ms
+#topic.flush.intervals.ms=topic1:1000, topic2:3000
+
+# The interval (in ms) at which logs are checked to see if they need to be flushed to disk.
+log.default.flush.scheduler.interval.ms=1000
+
+############################# Log Retention Policy #############################
+
+# The following configurations control the disposal of log segments. The policy can
+# be set to delete segments after a period of time, or after a given size has accumulated.
+# A segment will be deleted whenever *either* of these criteria are met. Deletion always happens
+# from the end of the log.
+
+# The minimum age of a log file to be eligible for deletion
+log.retention.hours=168
+
+# A size-based retention policy for logs. Segments are pruned from the log as long as the remaining
+# segments don't drop below log.retention.size.
+#log.retention.size=1073741824
+
+# The maximum size of a log segment file. When this size is reached a new log segment will be created.
+log.file.size=536870912
+
+# The interval at which log segments are checked to see if they can be deleted according 
+# to the retention policies
+log.cleanup.interval.mins=1
+
+############################# Zookeeper #############################
+
+# Enable connecting to zookeeper
+enable.zookeeper=true
+
+# Zk connection string (see zk docs for details).
+# This is a comma separated host:port pairs, each corresponding to a zk
+# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
+# You can also append an optional chroot string to the urls to specify the
+# root directory for all kafka znodes.
+zk.connect=${entity.zookeeper.hostname}:${entity.zookeeper.zookeeperPort?c}
+
+# Timeout in ms for connecting to zookeeper
+zk.connectiontimeout.ms=1000000

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/zookeeper.properties
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/zookeeper.properties b/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/zookeeper.properties
new file mode 100644
index 0000000..4827480
--- /dev/null
+++ b/software/messaging/src/main/resources/brooklyn/entity/messaging/kafka/zookeeper.properties
@@ -0,0 +1,25 @@
+[#ftl]
+# Copyright 2013 by Cloudsoft Corp.
+#
+# Licensed 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.
+
+##
+# KafkaZookeeper configuration template for Brooklyn
+##
+
+# the directory where the snapshot is stored.
+dataDir=${driver.runDir}/zookeeper
+# the port at which the clients will connect
+clientPort=${entity.zookeeperPort?c}
+# disable the per-ip limit on the number of connections since this is a non-production config
+maxClientCnxns=0

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
index f50de0c..28ff308 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
@@ -49,7 +49,11 @@ public class ActiveMQIntegrationTest {
 
     @AfterMethod(groups = "Integration")
     public void shutdown() {
-        if (app != null) Entities.destroyAll(app);
+        try {
+            if (app != null) Entities.destroyAll(app);
+        } catch (Exception e) {
+            log.warn("Error stopping entities", e);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
new file mode 100644
index 0000000..0943dcd
--- /dev/null
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static brooklyn.test.TestUtils.*
+import static java.util.concurrent.TimeUnit.*
+import static org.testng.Assert.*
+
+import java.util.concurrent.TimeUnit
+
+import javax.jms.Connection
+import javax.jms.MessageConsumer
+import javax.jms.MessageProducer
+import javax.jms.Queue
+import javax.jms.Session
+import javax.jms.TextMessage
+
+import org.apache.activemq.ActiveMQConnectionFactory
+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.basic.ApplicationBuilder
+import brooklyn.entity.basic.Entities
+import brooklyn.entity.proxying.BasicEntitySpec
+import brooklyn.entity.trait.Startable
+import brooklyn.location.Location
+import brooklyn.location.basic.LocalhostMachineProvisioningLocation
+import brooklyn.test.entity.TestApplication
+import brooklyn.util.internal.TimeExtras
+
+/**
+ * Test the operation of the {@link ActiveMQBroker} class.
+ */
+public class KafkaIntegrationTest {
+    private static final Logger log = LoggerFactory.getLogger(KafkaIntegrationTest.class)
+
+    static { TimeExtras.init() }
+
+    private TestApplication app
+    private Location testLocation
+
+    @BeforeMethod(groups = "Integration")
+    public void setup() {
+        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        testLocation = new LocalhostMachineProvisioningLocation()
+    }
+
+    @AfterMethod(groups = "Integration")
+    public void shutdown() {
+        if (app != null) Entities.destroyAll(app);
+    }
+
+    /**
+     * Test that we can start a zookeeper.
+     */
+    @Test(groups = "Integration")
+    public void testZookeeper() {
+        KafkaZookeeper zookeeper = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaZookeeper.class));
+
+        zookeeper.start([ testLocation ])
+        executeUntilSucceedsWithShutdown(zookeeper, timeout:600*TimeUnit.SECONDS) {
+            assertTrue zookeeper.getAttribute(Startable.SERVICE_UP)
+        }
+        assertFalse zookeeper.getAttribute(Startable.SERVICE_UP)
+    }
+
+    /**
+     * Test that we can start a  broker and zookeeper together.
+     */
+    @Test(groups = "Integration")
+    public void testBrokerPlusZookeeper() {
+        KafkaZookeeper zookeeper = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaZookeeper.class));
+        KafkaBroker broker = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaBroker.class).configure(KafkaBroker.ZOOKEEPER, zookeeper));
+
+        zookeeper.start([ testLocation ])
+        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
+            assertTrue zookeeper.getAttribute(Startable.SERVICE_UP)
+        }
+    
+        broker.start([ testLocation ])
+        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
+            assertTrue broker.getAttribute(Startable.SERVICE_UP)
+        }
+    }
+
+    /**
+     * Test that we can start a cluster with zookeeper and one broker.
+     */
+    @Test(groups = "Integration")
+    public void testSingleBrokerCluster() {
+        KafkaCluster cluster = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaCluster.class).configure(KafkaCluster.INITIAL_SIZE, 1));
+
+        cluster.start([ testLocation ])
+        executeUntilSucceedsWithShutdown(cluster, timeout:600*TimeUnit.SECONDS) {
+            assertTrue cluster.getAttribute(Startable.SERVICE_UP)
+            Entities.dumpInfo(cluster)
+        }
+        assertFalse cluster.getAttribute(Startable.SERVICE_UP)
+    }
+
+    // TODO test with API sending messages
+    // TODO test that sensors update
+    // TODO add demo application
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/37e890c2/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
new file mode 100644
index 0000000..6229b4e
--- /dev/null
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import brooklyn.entity.AbstractEc2LiveTest;
+import brooklyn.location.Location;
+
+public class KafkaLiveTest extends AbstractEc2LiveTest {
+
+    /**
+     * Test Kafka cluster operation.
+     */
+    @Override
+    protected void doTest(Location loc) throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+}


[08/50] brooklyn-library git commit: Rename AbstractEntity.postConstruct() to init()

Posted by he...@apache.org.
Rename AbstractEntity.postConstruct() to init()

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/3c0588c5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/3c0588c5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/3c0588c5

Branch: refs/heads/0.5.0
Commit: 3c0588c55cab9a213d5dcef3050a26c689316321
Parents: 8c9b039
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 14:30:35 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Mar 28 14:30:35 2013 +0000

----------------------------------------------------------------------
 .../java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java  | 2 +-
 .../java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java   | 2 +-
 .../src/main/java/brooklyn/demo/CumulusRDFApplication.java       | 2 +-
 .../main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java    | 4 ++--
 .../java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java   | 4 ++--
 .../brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java    | 4 ++--
 .../entity/webapp/ControlledDynamicWebAppClusterImpl.java        | 4 ++--
 7 files changed, 11 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
index c1e4fcf..683938d 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
@@ -75,7 +75,7 @@ public class WebClusterWithHadoopExample extends AbstractApplication implements
     }
     
     @Override
-    public void postConstruct() {
+    public void init() {
         StringConfigMap config = getManagementContext().getConfig();
     
         hadoopCluster = addChild(EntitySpecs.spec(WhirrHadoopCluster.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
index a07d5d6..d53b798 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
@@ -93,7 +93,7 @@ public class WebFabricWithHadoopExample extends AbstractApplication implements S
     }
     
     @Override
-    public void postConstruct() {
+    public void init() {
         StringConfigMap config = getManagementContext().getConfig();
         
         hadoopCluster = addChild(EntitySpecs.spec(WhirrHadoopCluster.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java
----------------------------------------------------------------------
diff --git a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java
index 3ffacb0..92d2141 100644
--- a/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java
+++ b/examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java
@@ -24,7 +24,7 @@ import brooklyn.entity.webapp.tomcat.TomcatServer;
 public class CumulusRDFApplication extends AbstractApplication {
 
     /** Create entities. */
-    public void postConstruct() {
+    public void init() {
         TomcatServer tomcat = getEntityManager().createEntity(EntitySpecs.spec(TomcatServer.class)
                 .configure("war", "classpath:///cumulusrdf.war"));
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
index 109ca61..898a410 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
@@ -90,8 +90,8 @@ public class WebClusterDatabaseExampleApp extends AbstractApplication implements
     public static final AttributeSensor<String> ROOT_URL = WebAppServiceConstants.ROOT_URL;
 
     @Override
-    public void postConstruct() {
-        super.postConstruct();
+    public void init() {
+        super.init();
 
         MySqlNode mysql = addChild(
                 EntitySpecs.spec(MySqlNode.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java b/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java
index ec00e26..cbdbb55 100644
--- a/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java
+++ b/software/database/src/main/java/brooklyn/entity/database/rubyrep/RubyRepNodeImpl.java
@@ -31,8 +31,8 @@ public class RubyRepNodeImpl extends SoftwareProcessImpl implements RubyRepNode
      * Adds support for binding to brooklyn DatabaseNodes (so the user doesn't have to call attributeWhenReady, etc)
      */
     @Override
-    public void postConstruct() {
-        super.postConstruct();
+    public void init() {
+        super.init();
 
         DatabaseNode leftNode = getConfig(LEFT_DATABASE);
         DatabaseNode rightNode = getConfig(RIGHT_DATABASE);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java
index 7741e9f..44fbd8d 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraClusterImpl.java
@@ -56,8 +56,8 @@ public class CassandraClusterImpl extends DynamicClusterImpl implements Cassandr
     }
 
     @Override
-    public void postConstruct() {
-        super.postConstruct();
+    public void init() {
+        super.init();
 
         // This DeferredSupplier will return a comma separated list of all available
         // hostnames in the cluster or if none are available yet then a Task for the first

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0588c5/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 1c728fb..757c1b6 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterImpl.java
@@ -52,7 +52,7 @@ public class ControlledDynamicWebAppClusterImpl extends AbstractEntity implement
     }
 
     @Override
-    public void postConstruct() {
+    public void init() {
         ConfigToAttributes.apply(this, FACTORY);
         ConfigToAttributes.apply(this, MEMBER_SPEC);
         ConfigToAttributes.apply(this, CONTROLLER);
@@ -110,7 +110,7 @@ public class ControlledDynamicWebAppClusterImpl extends AbstractEntity implement
     
     public void start(Collection<? extends Location> locations) {
         if (isLegacyConstruction()) {
-            postConstruct();
+            init();
         }
         
         if (locations.isEmpty()) locations = this.getLocations();


[27/50] brooklyn-library git commit: Update test using Kafka API

Posted by he...@apache.org.
Update test using Kafka API


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/ea32c5ad
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/ea32c5ad
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/ea32c5ad

Branch: refs/heads/0.5.0
Commit: ea32c5ad63b80c2e3b0b4c60f7f35c28042d5b38
Parents: dee689a
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Mar 20 23:46:05 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../entity/messaging/kafka/KafkaBrokerImpl.java |  2 +-
 .../messaging/kafka/KafkaIntegrationTest.groovy |  5 ++---
 .../entity/messaging/kafka/KafkaSupport.java    | 23 +++++++++++---------
 3 files changed, 16 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/ea32c5ad/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index 625fe3f..ed9ae0c 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -64,7 +64,7 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
 
     @Override
     public void postConstruct() {
-        setAttribute(BROKER_ID, hashCode());
+        setAttribute(BROKER_ID, Math.abs(hashCode())); // Must be positive for partitioning to work
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/ea32c5ad/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
index 89f5773..2ef95c5 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
@@ -119,9 +119,8 @@ public class KafkaIntegrationTest {
 
         KafkaSupport support = new KafkaSupport(cluster.getZookeeper());
         support.sendMessage("brooklyn", "TEST_MESSAGE")
-        List<String> messages = support.getMessage("brooklyn");
-        assertEquals(messages.size(), 1);
-        assertEquals(messages.get(0), "TEST_MESSAGE");
+        String message = support.getMessage("brooklyn");
+        assertEquals(message, "TEST_MESSAGE");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/ea32c5ad/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
index d026f06..d9372a9 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
@@ -15,13 +15,15 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import static org.testng.Assert.*;
+import static org.testng.Assert.assertTrue;
 
+import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Properties;
 
 import kafka.consumer.Consumer;
 import kafka.consumer.ConsumerConfig;
+import kafka.consumer.ConsumerIterator;
 import kafka.consumer.KafkaMessageStream;
 import kafka.javaapi.consumer.ConsumerConnector;
 import kafka.javaapi.producer.Producer;
@@ -53,20 +55,21 @@ public class KafkaSupport {
         producer.close();
     }
 
-    public List<String> getMessage(String topic) {
+    public String getMessage(String topic) {
         Properties props = new Properties();
         props.put("zk.connect", String.format("%s:%d", zookeeper.getAttribute(Attributes.HOSTNAME), zookeeper.getZookeeperPort()));
         props.put("zk.connectiontimeout.ms", "1000000");
-        props.put("groupid", "test_group");
+        props.put("groupid", "brooklyn");
         ConsumerConfig consumerConfig = new ConsumerConfig(props);
         ConsumerConnector consumer = Consumer.createJavaConsumerConnector(consumerConfig);
         List<KafkaMessageStream<Message>> streams = consumer.createMessageStreams(ImmutableMap.of(topic, 1)).get(topic);
-        List<String> messages = Lists.newArrayList();
-        for (Message msg : Iterables.getOnlyElement(streams)) {
-            assertTrue(msg.isValid());
-            String payload = new String(msg.payload().array());
-            messages.add(payload);
-          }
-        return messages;
+        ConsumerIterator<Message> iterator = Iterables.getOnlyElement(streams).iterator();
+        Message msg = iterator.next();
+        assertTrue(msg.isValid());
+        ByteBuffer buf = msg.payload();
+        byte[] data = new byte[buf.remaining()];
+        buf.get(data);
+        String payload = new String(data);
+        return payload;
     }
 }


[43/50] brooklyn-library git commit: Tidying up Redis entity code - Convert RedisIntegrationTest to Java - Update RedisStore to use FreeMarker template - Use RedisSupport class to encapsulate API testing - Use SshFeed to poll for uptime

Posted by he...@apache.org.
Tidying up Redis entity code
- Convert RedisIntegrationTest to Java
- Update RedisStore to use FreeMarker template
- Use RedisSupport class to encapsulate API testing
- Use SshFeed to poll for uptime


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/e9cb1572
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/e9cb1572
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/e9cb1572

Branch: refs/heads/0.5.0
Commit: e9cb1572990ac3e678b3f953c1c26ad219af28b8
Parents: e4098ab
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Mon Apr 22 14:40:19 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:44 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisCluster.java        |   2 +-
 .../entity/nosql/redis/RedisClusterImpl.java    |  15 +--
 .../brooklyn/entity/nosql/redis/RedisSlave.java |  16 +++-
 .../entity/nosql/redis/RedisSlaveImpl.java      |  14 +--
 .../brooklyn/entity/nosql/redis/RedisStore.java |  25 ++---
 .../entity/nosql/redis/RedisStoreImpl.java      |  86 ++++++++---------
 .../entity/nosql/redis/RedisStoreSshDriver.java |   6 +-
 .../brooklyn/entity/nosql/redis/redis.conf      |  13 +++
 .../brooklyn/entity/nosql/redis/slave.conf      |  13 +++
 .../nosql/src/main/resources/redis-logo.png     | Bin 0 -> 34333 bytes
 .../entity/nosql/redis/RedisEc2LiveTest.java    |  22 ++---
 .../nosql/redis/RedisIntegrationTest.groovy     |  93 -------------------
 .../nosql/redis/RedisIntegrationTest.java       |  77 +++++++++++++++
 .../entity/nosql/redis/RedisSupport.java        |  41 ++++++++
 14 files changed, 227 insertions(+), 196 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
index 57b3682..0393926 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
@@ -13,7 +13,7 @@ import brooklyn.entity.trait.Startable;
  *
  * TODO add sensors with aggregated Redis statistics from cluster
  */
-@Catalog(name="Redis Cluster", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.jpeg")
+@Catalog(name="Redis Cluster", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.png")
 @ImplementedBy(RedisClusterImpl.class)
 public interface RedisCluster extends Entity, Startable {
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
index 08d114a..6a5e6ff 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
@@ -16,7 +16,7 @@ import brooklyn.util.MutableMap;
 import com.google.common.collect.Maps;
 
 public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
-    Map redisProperties = Maps.newLinkedHashMap();
+
     RedisStore master;
     DynamicCluster slaves;
 
@@ -31,23 +31,18 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
     }
     public RedisClusterImpl(Map properties, Entity parent) {
         super(properties, parent);
-
-        redisProperties.putAll(properties);
     }
 
     @Override
     public void start(Collection<? extends Location> locations) {
-        master = addChild(EntitySpecs.spec(RedisStore.class)
-                .configure(redisProperties));
+        master = addChild(EntitySpecs.spec(RedisStore.class));
         Entities.manage(master);
         master.start(locations);
-        redisProperties.put("master", master);
-        
+
         slaves = addChild(EntitySpecs.spec(DynamicCluster.class)
-                .configure(redisProperties)
-                .configure(DynamicCluster.FACTORY, new BasicConfigurableEntityFactory(RedisSlave.class)));
+                .configure(DynamicCluster.MEMBER_SPEC, EntitySpecs.spec(RedisSlave.class).configure(RedisSlave.MASTER, master)));
         slaves.start(locations);
-        
+
         setAttribute(Startable.SERVICE_UP, true);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
index d433688..6b07c2b 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
@@ -1,12 +1,24 @@
 package brooklyn.entity.nosql.redis;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.util.flags.SetFromFlag;
 
 /**
  * A {@link RedisStore} configured as a slave.
- *
- * The {@code master} property must be set to the master Redis store entity.
  */
 @ImplementedBy(RedisSlaveImpl.class)
 public interface RedisSlave extends RedisStore {
+
+    @SetFromFlag("master")
+    ConfigKey<RedisStore> MASTER = new BasicConfigKey<RedisStore>(RedisStore.class, "redis.master", "Redis master");
+
+    @SetFromFlag("redisConfigTemplateUrl")
+    ConfigKey<String> REDIS_CONFIG_TEMPLATE_URL = new BasicConfigKey<String>(
+            String.class, "redis.config.templateUrl", "Template file (in freemarker format) for the redis.conf config file", 
+            "classpath://brooklyn/entity/nosql/redis/slave.conf");
+
+    RedisStore getMaster();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
index 2ea0783..c0718b9 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
@@ -9,11 +9,8 @@ import com.google.common.base.Preconditions;
 
 /**
  * A {@link RedisStore} configured as a slave.
- *
- * The {@code master} property must be set to the master Redis store entity.
  */
 public class RedisSlaveImpl extends RedisStoreImpl implements RedisSlave {
-    RedisStore master;
 
     public RedisSlaveImpl() {
         this(MutableMap.of(), null);
@@ -26,17 +23,10 @@ public class RedisSlaveImpl extends RedisStoreImpl implements RedisSlave {
     }
     public RedisSlaveImpl(Map properties, Entity parent) {
         super(properties, parent);
-
-        // TODO Use config key for "master"
-        Preconditions.checkArgument(properties.containsKey("master"), "The Redis master entity must be specified");
-        master = (RedisStore) properties.get("master");
     }
 
     @Override
-    public String getConfigData(int port, boolean include) {
-        String masterAddress = master.getAddress();
-        int masterPort = getParent().getAttribute(REDIS_PORT);
-
-        return super.getConfigData(port, include) + "slaveof "+masterAddress+" "+masterPort;
+    public RedisStore getMaster() {
+        return getConfig(MASTER);
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
index a6ce441..492da2d 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
@@ -22,22 +22,23 @@ import brooklyn.util.flags.SetFromFlag;
 public interface RedisStore extends SoftwareProcess, DataStore {
 
     @SetFromFlag("version")
-    public static final BasicConfigKey<String> SUGGESTED_VERSION =
+    BasicConfigKey<String> SUGGESTED_VERSION =
             new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "2.6.7");
 
     @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
+    BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
             SoftwareProcess.DOWNLOAD_URL, "http://redis.googlecode.com/files/redis-${version}.tar.gz");
 
     @SetFromFlag("redisPort")
-    public static final PortAttributeSensorAndConfigKey REDIS_PORT = new PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
-    
-    @SetFromFlag("configFile")
-    public static final ConfigKey<String> REDIS_CONFIG_FILE = new BasicConfigKey<String>(String.class, "redis.config.file", "Redis user configuration file");
-    
-    public static final AttributeSensor<Integer> UPTIME = new BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in seconds");
-
-    public String getAddress();
-    
-    public String getConfigData(int port, boolean include);
+    PortAttributeSensorAndConfigKey REDIS_PORT = new PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
+
+    @SetFromFlag("redisConfigTemplateUrl")
+    ConfigKey<String> REDIS_CONFIG_TEMPLATE_URL = new BasicConfigKey<String>(
+            String.class, "redis.config.templateUrl", "Template file (in freemarker format) for the redis.conf config file", 
+            "classpath://brooklyn/entity/nosql/redis/redis.conf");
+
+    AttributeSensor<Integer> UPTIME = new BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in seconds");
+
+    String getAddress();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
index 5c454cd..bf6c171 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
@@ -4,15 +4,27 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.util.Map;
 
+import javax.annotation.Nullable;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.event.feed.ssh.SshFeed;
+import brooklyn.event.feed.ssh.SshPollConfig;
+import brooklyn.event.feed.ssh.SshValueFunctions;
 import brooklyn.location.MachineLocation;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
 
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicates;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
 /**
  * An entity that represents a Redis key-value store service.
  *
@@ -21,6 +33,8 @@ import brooklyn.util.MutableMap;
 public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
     protected static final Logger LOG = LoggerFactory.getLogger(RedisStore.class);
 
+    private transient SshFeed sshFeed;
+
     public RedisStoreImpl() {
         this(MutableMap.of(), null);
     }
@@ -39,25 +53,37 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
         super.connectSensors();
 
         connectServiceUpIsRunning();
-        
-        // TODO IF desired, port this for setting UPTIME (because legacy sshAdapter is deleted)
-//        String output = sshAdapter.newOutputValueProvider("${driver.runDir}/bin/redis-cli info").compute()
-//        for (String line : output.split("\n")) {
-//            if (line =~ /^uptime_in_seconds:/) {
-//                String data = line.trim()
-//                int colon = data.indexOf(":")
-//                return Integer.parseInt(data.substring(colon + 1))
-//            }
-//        }
+
+        sshFeed = SshFeed.builder()
+                .entity(this)
+                .poll(new SshPollConfig<Integer>(UPTIME)
+                        .command(getDriver().getRunDir() + "/bin/redis-cli info")
+                        .onError(Functions.constant(-1))
+                        .onSuccess(Functions.compose(new Function<String, Integer>(){
+                            @Override
+                            public Integer apply(@Nullable String input) {
+                                Optional<String> line = Iterables.tryFind(Splitter.on('\n').split(input), Predicates.containsPattern("uptime_in_seconds:"));
+                                if (line.isPresent()) {
+                                    String data = line.get().trim();
+                                    int colon = data.indexOf(":");
+                                    return Integer.parseInt(data.substring(colon + 1));
+                                } else {
+                                    throw new IllegalStateException();
+                                }
+                            }
+                        }, SshValueFunctions.stdout())))
+                .build();
     }
 
     @Override
     public void disconnectSensors() {
         super.disconnectSensors();
         disconnectServiceUpIsRunning();
+        if (sshFeed != null && sshFeed.isActivated()) sshFeed.stop();
     }
-    
-    public Class getDriverInterface() {
+
+    @Override
+    public Class<?> getDriverInterface() {
         return RedisStoreDriver.class;
     }
 
@@ -65,45 +91,11 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
     public RedisStoreDriver getDriver() {
         return (RedisStoreDriver) super.getDriver();
     }
-    
+
     @Override
     public String getAddress() {
         MachineLocation machine = getMachineOrNull();
         return (machine != null) ? machine.getAddress().getHostAddress() : null;
     }
-    
-    
-    // FIXME Don't want to hard-code this as SshMachineLocatoin; want generic way of doing machine.copyTo
-    @Override
-    protected SshMachineLocation getMachineOrNull() {
-        return (SshMachineLocation) super.getMachineOrNull();
-    }
-    
-    // FIXME This logic should all be in the driver
-    void doExtraConfigurationDuringStart() {
-	    int port = getAttribute(REDIS_PORT);
-        boolean include = false;
-
-        String includeName = getConfig(REDIS_CONFIG_FILE);
-        if (includeName != null && includeName.length() > 0) {
-            File includeFile = new File(includeName);
-	        include = includeFile.exists();
-        }
-
-		getMachineOrNull().copyTo(new ByteArrayInputStream(getConfigData(port, include).getBytes()), getDriver().getRunDir()+"/redis.conf");
-        if (include) getMachineOrNull().copyTo(new File(includeName), getDriver().getRunDir()+"/include.conf");
-        
-        super.configure();
-    }
 
-    @Override
-    public String getConfigData(int port, boolean include) {
-        String data = 
-                "daemonize yes"+"\n"+
-                "pidfile "+getDriver().getRunDir()+"/pid.txt"+"\n"+
-                "port "+port+"\n";
-
-        if (include) data += "include "+getDriver().getRunDir()+"/include.conf";
-        return data;
-    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 8b8e8ae..7cbe3c7 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -68,10 +68,10 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
                         format("cd %s", getExpandedInstallDir()),
                         "make install PREFIX="+getRunDir())
                 .execute();
-        
-        getEntity().doExtraConfigurationDuringStart();
+
+        copyTemplate(getEntity().getConfig(RedisStore.REDIS_CONFIG_TEMPLATE_URL), "redis.conf");
     }
-    
+
     @Override
     public void launch() {
         // TODO Should we redirect stdout/stderr: format(" >> %s/console 2>&1 </dev/null &", getRunDir())

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
new file mode 100644
index 0000000..b2dd5cb
--- /dev/null
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
@@ -0,0 +1,13 @@
+# Redis configuration file
+
+# Start as daemon
+daemonize yes
+pidfile ${driver.runDir}/pid.txt
+
+# Set port and optional bind address
+port ${entity.port}
+# bind ${driver.machine.address}
+
+# Configure logging
+loglevel verbose
+logfile ${driver.runDir}/redis.log

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
new file mode 100644
index 0000000..b2dd5cb
--- /dev/null
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
@@ -0,0 +1,13 @@
+# Redis configuration file
+
+# Start as daemon
+daemonize yes
+pidfile ${driver.runDir}/pid.txt
+
+# Set port and optional bind address
+port ${entity.port}
+# bind ${driver.machine.address}
+
+# Configure logging
+loglevel verbose
+logfile ${driver.runDir}/redis.log

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/main/resources/redis-logo.png
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/redis-logo.png b/software/nosql/src/main/resources/redis-logo.png
new file mode 100644
index 0000000..4ad2561
Binary files /dev/null and b/software/nosql/src/main/resources/redis-logo.png differ

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
index d49fee5..eb49ac9 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
@@ -1,12 +1,9 @@
 package brooklyn.entity.nosql.redis;
 
-import static org.testng.Assert.assertTrue;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
-import redis.clients.jedis.Connection;
 import brooklyn.entity.AbstractEc2LiveTest;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.location.Location;
@@ -28,25 +25,18 @@ public class RedisEc2LiveTest extends AbstractEc2LiveTest {
 
     @Override
     protected void doTest(Location loc) throws Exception {
-        // Start Redis
         RedisStore redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
         app.start(ImmutableList.of(loc));
         EntityTestUtils.assertAttributeEqualsEventually(redis, RedisStore.SERVICE_UP, true);
 
-        // Access Redis
-        Connection connection = getRedisConnection(redis);
-        assertTrue(connection.isConnected());
-        connection.disconnect();
+        RedisSupport support = new RedisSupport(redis);
+        try {
+            support.redisTest();
+        } finally {
+            redis.stop();
+        }
     }
 
-    private Connection getRedisConnection(RedisStore redis) {
-        String hostname = redis.getAttribute(RedisStore.HOSTNAME);
-        int port = redis.getAttribute(RedisStore.REDIS_PORT);
-        Connection connection = new Connection(hostname, port);
-        connection.connect();
-        return connection;
-    }
-    
     @Test(enabled=false)
     public void testDummy() {} // Convince testng IDE integration that this really does have test methods  
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
deleted file mode 100644
index 44d9e0e..0000000
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
+++ /dev/null
@@ -1,93 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import static brooklyn.test.TestUtils.*
-import static org.testng.Assert.*
-
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import org.testng.annotations.AfterMethod
-import org.testng.annotations.BeforeMethod
-import org.testng.annotations.Test
-
-import redis.clients.jedis.Connection
-import brooklyn.entity.basic.ApplicationBuilder
-import brooklyn.entity.basic.Entities
-import brooklyn.entity.proxying.EntitySpecs
-import brooklyn.entity.trait.Startable
-import brooklyn.location.Location
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation
-import brooklyn.test.entity.TestApplication
-import brooklyn.util.internal.TimeExtras
-
-/**
- * Test the operation of the {@link RedisStore} class.
- *
- * TODO clarify test purpose
- */
-public class RedisIntegrationTest {
-    private static final Logger log = LoggerFactory.getLogger(RedisIntegrationTest.class)
-
-    static { TimeExtras.init() }
-
-    private TestApplication app
-    private Location testLocation
-    private RedisStore redis
-
-    @BeforeMethod(alwaysRun=true)
-    public void setup() {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        testLocation = new LocalhostMachineProvisioningLocation(name:'london')
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void shutdown() {
-        if (app != null) Entities.destroyAll(app);
-    }
-
-    /**
-     * Test that the server starts up and sets SERVICE_UP correctly.
-     */
-    // FIXME Marked as WIP because failing in jenkins; environmental differences?
-    @Test(groups = ["Integration"])
-    public void canStartupAndShutdown() {
-        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
-        app.start([ testLocation ])
-        executeUntilSucceeds() {
-            assertTrue redis.getAttribute(Startable.SERVICE_UP)
-        }
-        
-        redis.stop()
-        assertFalse redis.getAttribute(Startable.SERVICE_UP)
-    }
-
-    /**
-     * Test that a client can connect to the service.
-     */
-    // FIXME Marked as WIP because failing in jenkins; environmental differences?
-    @Test(groups = ["Integration"])
-    public void testRedisConnection() {
-        // Start Redis
-        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
-        app.start([ testLocation ])
-        executeUntilSucceeds {
-            assertTrue redis.getAttribute(Startable.SERVICE_UP)
-        }
-
-        try {
-            // Access Redis
-            Connection connection = getRedisConnection(redis)
-            assertTrue connection.isConnected()
-            connection.disconnect()
-        } finally {
-            // Stop broker
-	        redis.stop()
-        }
-    }
-
-    private Connection getRedisConnection(RedisStore redis) {
-        int port = redis.getAttribute(RedisStore.REDIS_PORT)
-        Connection connection = new Connection("localhost", port)
-        connection.connect()
-        return connection
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
new file mode 100644
index 0000000..1ddfa92
--- /dev/null
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
@@ -0,0 +1,77 @@
+package brooklyn.entity.nosql.redis;
+
+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.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.entity.trait.Startable;
+import brooklyn.location.Location;
+import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
+import brooklyn.test.EntityTestUtils;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.util.MutableMap;
+import brooklyn.util.internal.TimeExtras;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Test the operation of the {@link RedisStore} class.
+ */
+public class RedisIntegrationTest {
+
+    static { TimeExtras.init(); }
+
+    private TestApplication app;
+    private Location testLocation;
+    private RedisStore redis;
+
+    @BeforeMethod(alwaysRun=true)
+    public void setup() {
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        testLocation = new LocalhostMachineProvisioningLocation(MutableMap.of("name", "london"));
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void shutdown() {
+        if (app != null) Entities.destroyAll(app);
+    }
+
+    /**
+     * Test that the server starts up and sets SERVICE_UP correctly.
+     */
+    @Test(groups = { "Integration" })
+    public void canStartupAndShutdown() throws Exception {
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
+        app.start(ImmutableList.of(testLocation));
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, Startable.SERVICE_UP, true);
+
+        redis.stop();
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, Startable.SERVICE_UP, false);
+    }
+
+    /**
+     * Test that a client can connect to the service.
+     */
+    @Test(groups = { "Integration" })
+    public void testRedisConnection() throws Exception {
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
+        app.start(ImmutableList.of(testLocation));
+
+        EntityTestUtils.assertAttributeEqualsEventually(redis, Startable.SERVICE_UP, true);
+
+        RedisSupport support = new RedisSupport(redis);
+        try {
+            support.redisTest();
+        } finally {
+            redis.stop();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e9cb1572/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
new file mode 100644
index 0000000..f617922
--- /dev/null
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012-2013 by Cloudsoft Corp.
+ */
+package brooklyn.entity.nosql.redis;
+
+import static org.testng.Assert.assertTrue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Connection;
+
+/**
+ * {@link RedisStore} testing using Redis API.
+ */
+public class RedisSupport {
+    private static final Logger log = LoggerFactory.getLogger(RedisSupport.class);
+
+    private RedisStore redis;
+
+    public RedisSupport(RedisStore redis) {
+        this.redis = redis;
+    }
+
+    /**
+     * Exercise the {@link RedisStore} using the Redis API.
+     */
+    public void redisTest() throws Exception {
+        // Access Redis
+        Connection connection = getRedisConnection(redis);
+        assertTrue(connection.isConnected());
+        connection.disconnect();
+    }
+
+    private Connection getRedisConnection(RedisStore redis) {
+        int port = redis.getAttribute(RedisStore.REDIS_PORT);
+        Connection connection = new Connection("localhost", port);
+        connection.connect();
+        return connection;
+    }
+}


[12/50] brooklyn-library git commit: converting postConstruct to init

Posted by he...@apache.org.
converting postConstruct to init


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/32a6eba5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/32a6eba5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/32a6eba5

Branch: refs/heads/0.5.0
Commit: 32a6eba53bc5706d3f097d0300230a06c66f5829
Parents: 3c0f5e6
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Apr 1 12:30:26 2013 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Apr 1 12:41:41 2013 +0100

----------------------------------------------------------------------
 .../src/main/java/brooklyn/demo/GlobalWebFabricExample.java    | 2 +-
 .../src/main/java/brooklyn/extras/whirr/WhirrExample.java      | 4 ++--
 .../main/java/brooklyn/extras/whirr/WhirrHadoopExample.java    | 4 ++--
 .../java/brooklyn/demo/MonitoredCassandraClusterExample.java   | 2 +-
 .../cloudfoundry/MovableCloudFoundryClusterExample.java        | 2 +-
 .../src/main/java/brooklyn/demo/StandaloneBrokerExample.java   | 2 +-
 .../src/main/java/brooklyn/demo/SingleWebServerExample.java    | 2 +-
 .../src/main/java/brooklyn/demo/WebClusterDatabaseExample.java | 2 +-
 .../main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java  | 6 ++----
 .../java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy  | 2 +-
 .../src/main/java/brooklyn/demo/WebClusterExample.java         | 2 +-
 11 files changed, 14 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
----------------------------------------------------------------------
diff --git a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
index dbfab17..774affa 100644
--- a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
+++ b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
@@ -41,7 +41,7 @@ public class GlobalWebFabricExample extends AbstractApplication {
         );
 
     @Override
-    public void postConstruct() {
+    public void init() {
         StringConfigMap config = getManagementContext().getConfig();
         
         GeoscalingDnsService geoDns = addChild(EntitySpecs.spec(GeoscalingDnsService.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
index d01bc4c..aef2f0e 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
@@ -27,8 +27,8 @@ public class WhirrExample extends AbstractApplication {
             "whirr.instance-templates=1 noop, 1 elasticsearch"+"\n";
 
     @Override
-    public void postConstruct() {
-        WhirrCluster cluster = addChild(EntitySpecs.spec(WhirrCluster.class)
+    public void init() {
+        addChild(EntitySpecs.spec(WhirrCluster.class)
                 .configure("recipe", RECIPE));
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
index 7a51b0c..d15d163 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
@@ -23,8 +23,8 @@ public class WhirrHadoopExample extends AbstractApplication {
     public static final String DEFAULT_LOCATION = "aws-ec2:eu-west-1";
 
     @Override
-    public void postConstruct() {
-        WhirrCluster cluster = addChild(EntitySpecs.spec(WhirrHadoopCluster.class)
+    public void init() {
+        addChild(EntitySpecs.spec(WhirrHadoopCluster.class)
                 .displayName("brooklyn-hadoop-example")
                 .configure("size", 2)
                 .configure("memory", 2048));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
index 6c475b2..9c543e3 100644
--- a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
+++ b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
@@ -8,7 +8,7 @@ import brooklyn.entity.proxying.EntitySpecs;
 public class MonitoredCassandraClusterExample extends AbstractApplication {
 
     @Override
-    public void postConstruct() {
+    public void init() {
         addChild(EntitySpecs.spec(CassandraCluster.class)
                 .configure("initialSize", "2")
                 .configure("clusterName", "CassandraDemo")

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
index ee96826..3b30d1e 100644
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
+++ b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
@@ -16,7 +16,7 @@ public class MovableCloudFoundryClusterExample extends AbstractApplication {
     public static final String WAR_FILE_URL = "classpath://hello-world-webapp.war";
 
     @Override
-    public void postConstruct() {
+    public void init() {
         addChild(EntitySpecs.spec(MovableElasticWebAppCluster.class)
                 .configure("war", WAR_FILE_URL));
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
index 3d9b903..83cdc31 100644
--- a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
+++ b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
@@ -24,7 +24,7 @@ public class StandaloneBrokerExample extends AbstractApplication {
     public static final String DEFAULT_LOCATION = "localhost";
     
     @Override
-    public void postConstruct() {
+    public void init() {
         // Configure the Qpid broker entity
     	QpidBroker broker = addChild(EntitySpecs.spec(QpidBroker.class)
     	        .configure("amqpPort", 5672)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
index 10905e1..3272a6c 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
@@ -22,7 +22,7 @@ public class SingleWebServerExample extends AbstractApplication {
     private static final String WAR_PATH = "classpath://hello-world-webapp.war";
 
     @Override
-    public void postConstruct() {
+    public void init() {
         addChild(EntitySpecs.spec(JBoss7Server.class)
                 .configure("war", WAR_PATH)
                 .configure("httpPort", "8080+"));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
index 5436ee6..5c673b1 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
@@ -48,7 +48,7 @@ public class WebClusterDatabaseExample extends AbstractApplication {
             "appservers.count", "Number of app servers deployed");
 
     @Override
-    public void postConstruct() {
+    public void init() {
         MySqlNode mysql = addChild(EntitySpecs.spec(MySqlNode.class)
                 .configure("creationScriptUrl", DB_SETUP_SQL_URL));
         

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
index df88bb9..014a58a 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
@@ -41,10 +41,8 @@ import com.google.common.collect.Lists;
 /**
  * Launches a 3-tier app with nginx, clustered jboss, and mysql.
  * <p>
- * Demonstrates how to define a new Application Entity class (reusable and extensible),
- * as opposed to just using the builder as in {@link WebClusterDatabaseExample}.
- * With an app, when we define public static sensors and runtime config _on the app class_ 
- * (not the builder) they can be discovered at runtime.
+ * Includes some advanced features such as KPI / derived sensors,
+ * and annotations for use in a catalog.
  * <p>
  * This variant also increases minimum size to 2.  
  * Note the policy min size must have the same value,

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
index ee2652c..542cd8a 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
@@ -39,7 +39,7 @@ public class WebClusterDatabaseExampleGroovy extends AbstractApplication {
     public static final String DB_PASSWORD = "br00k11n";
     
     @Override
-    public void postConstruct() {
+    public void init() {
         MySqlNode mysql = addChild(MySqlNode,
                 creationScriptUrl: DB_SETUP_SQL_URL);
         

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/32a6eba5/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
index 8e6f670..86c28ee 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
@@ -41,7 +41,7 @@ public class WebClusterExample extends AbstractApplication {
     private ControlledDynamicWebAppCluster web;
     
     @Override
-    public void postConstruct() {
+    public void init() {
         nginxController = addChild(EntitySpecs.spec(NginxController.class)
                 //.configure("domain", "webclusterexample.brooklyn.local")
                 .configure("port", "8000+"));


[18/50] brooklyn-library git commit: Merge pull request #661 from grkvlt/0.5-remove-old-example

Posted by he...@apache.org.
Merge pull request #661 from grkvlt/0.5-remove-old-example

Remove old monitored-cassandra-cluster example project

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/227e33d5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/227e33d5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/227e33d5

Branch: refs/heads/0.5.0
Commit: 227e33d57d798f67f6af401dbeb2b2430df6b025
Parents: 49d15bb 8ff050f
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 10 13:46:49 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Apr 10 13:46:49 2013 -0700

----------------------------------------------------------------------
 .../demo/MonitoredCassandraClusterExample.java  | 20 --------------------
 1 file changed, 20 deletions(-)
----------------------------------------------------------------------



[39/50] brooklyn-library git commit: Redis: split interface+impl, and fix ec2 test

Posted by he...@apache.org.
Redis: split interface+impl, and fix ec2 test


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/c06d64c0
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/c06d64c0
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/c06d64c0

Branch: refs/heads/0.5.0
Commit: c06d64c0b7764baa7d31938c991b45d4c94bd848
Parents: 464ef00
Author: Aled Sage <al...@gmail.com>
Authored: Mon Apr 22 13:09:04 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:43 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisCluster.java        |  71 ----------
 .../entity/nosql/redis/RedisClusterImpl.java    |  66 +++++++++
 .../brooklyn/entity/nosql/redis/RedisShard.java |  23 ----
 .../entity/nosql/redis/RedisShardImpl.java      |  22 +++
 .../brooklyn/entity/nosql/redis/RedisSlave.java |  41 ------
 .../entity/nosql/redis/RedisSlaveImpl.java      |  42 ++++++
 .../brooklyn/entity/nosql/redis/RedisStore.java | 134 -------------------
 .../entity/nosql/redis/RedisStoreImpl.java      | 109 +++++++++++++++
 .../entity/nosql/redis/RedisStoreSshDriver.java |   6 +-
 .../entity/nosql/redis/RedisEc2LiveTest.java    |  10 +-
 .../nosql/redis/RedisIntegrationTest.groovy     |  16 ++-
 11 files changed, 260 insertions(+), 280 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
deleted file mode 100644
index 7d063b5..0000000
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import java.util.Collection;
-import java.util.Map;
-
-import brooklyn.catalog.Catalog;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.AbstractEntity;
-import brooklyn.entity.basic.BasicConfigurableEntityFactory;
-import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.group.DynamicClusterImpl;
-import brooklyn.entity.trait.Startable;
-import brooklyn.location.Location;
-import brooklyn.util.MutableMap;
-
-import com.google.common.collect.Maps;
-
-/**
- * A cluster of {@link RedisStore}s with ione master and a group of slaves.
- *
- * The slaves are contained in a {@link DynamicCluster} which can be resized by a policy if required.
- *
- * TODO add sensors with aggregated Redis statistics from cluster
- */
-@Catalog(name="Redis Cluster", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.jpeg")
-public class RedisCluster extends AbstractEntity implements Startable {
-    Map redisProperties = Maps.newLinkedHashMap();
-    RedisCluster master;
-    DynamicCluster slaves;
-
-    public RedisCluster() {
-        this(MutableMap.of(), null);
-    }
-    public RedisCluster(Map properties) {
-        this(properties, null);
-    }
-    public RedisCluster(Entity parent) {
-        this(MutableMap.of(), parent);
-    }
-    public RedisCluster(Map properties, Entity parent) {
-        super(properties, parent);
-
-        redisProperties.putAll(properties);
-        redisProperties.put("factory", new BasicConfigurableEntityFactory(RedisSlave.class));
-    }
-
-    @Override
-    public void start(Collection<? extends Location> locations) {
-        master = new RedisCluster(redisProperties, this);
-        master.start(locations);
-        redisProperties.put("master", master);
-        
-        slaves = new DynamicClusterImpl(redisProperties, this);
-        slaves.start(locations);
-        
-        setAttribute(Startable.SERVICE_UP, true);
-    }
-
-    @Override
-    public void stop() {
-        slaves.stop();
-        master.stop();
-
-        setAttribute(Startable.SERVICE_UP, false);
-    }
-
-    @Override
-    public void restart() {
-        throw new UnsupportedOperationException();
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
new file mode 100644
index 0000000..08d114a
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
@@ -0,0 +1,66 @@
+package brooklyn.entity.nosql.redis;
+
+import java.util.Collection;
+import java.util.Map;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.entity.basic.BasicConfigurableEntityFactory;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.group.DynamicCluster;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.entity.trait.Startable;
+import brooklyn.location.Location;
+import brooklyn.util.MutableMap;
+
+import com.google.common.collect.Maps;
+
+public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
+    Map redisProperties = Maps.newLinkedHashMap();
+    RedisStore master;
+    DynamicCluster slaves;
+
+    public RedisClusterImpl() {
+        this(MutableMap.of(), null);
+    }
+    public RedisClusterImpl(Map properties) {
+        this(properties, null);
+    }
+    public RedisClusterImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public RedisClusterImpl(Map properties, Entity parent) {
+        super(properties, parent);
+
+        redisProperties.putAll(properties);
+    }
+
+    @Override
+    public void start(Collection<? extends Location> locations) {
+        master = addChild(EntitySpecs.spec(RedisStore.class)
+                .configure(redisProperties));
+        Entities.manage(master);
+        master.start(locations);
+        redisProperties.put("master", master);
+        
+        slaves = addChild(EntitySpecs.spec(DynamicCluster.class)
+                .configure(redisProperties)
+                .configure(DynamicCluster.FACTORY, new BasicConfigurableEntityFactory(RedisSlave.class)));
+        slaves.start(locations);
+        
+        setAttribute(Startable.SERVICE_UP, true);
+    }
+
+    @Override
+    public void stop() {
+        if (slaves != null) slaves.stop();
+        if (master != null) master.stop();
+
+        setAttribute(Startable.SERVICE_UP, false);
+    }
+
+    @Override
+    public void restart() {
+        throw new UnsupportedOperationException();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
deleted file mode 100644
index 9cad4ce..0000000
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import java.util.Map;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.AbstractEntity;
-import brooklyn.entity.nosql.Shard;
-import brooklyn.util.MutableMap;
-
-public class RedisShard extends AbstractEntity implements Shard {
-    public RedisShard() {
-        this(MutableMap.of(), null);
-    }
-    public RedisShard(Map properties) {
-        this(properties, null);
-    }
-    public RedisShard(Entity parent) {
-        this(MutableMap.of(), parent);
-    }
-    public RedisShard(Map properties, Entity parent) {
-        super(properties, parent);
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
new file mode 100644
index 0000000..0eee09f
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
@@ -0,0 +1,22 @@
+package brooklyn.entity.nosql.redis;
+
+import java.util.Map;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.util.MutableMap;
+
+public class RedisShardImpl extends AbstractEntity implements RedisShard {
+    public RedisShardImpl() {
+        this(MutableMap.of(), null);
+    }
+    public RedisShardImpl(Map properties) {
+        this(properties, null);
+    }
+    public RedisShardImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public RedisShardImpl(Map properties, Entity parent) {
+        super(properties, parent);
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
deleted file mode 100644
index cf4815b..0000000
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import java.util.Map;
-
-import brooklyn.entity.Entity;
-import brooklyn.util.MutableMap;
-
-import com.google.common.base.Preconditions;
-
-/**
- * A {@link RedisStore} configured as a slave.
- *
- * The {@code master} property must be set to the master Redis store entity.
- */
-public class RedisSlave extends RedisStore {
-    RedisStore master;
-
-    public RedisSlave() {
-        this(MutableMap.of(), null);
-    }
-    public RedisSlave(Map properties) {
-        this(properties, null);
-    }
-    public RedisSlave(Entity parent) {
-        this(MutableMap.of(), parent);
-    }
-    public RedisSlave(Map properties, Entity parent) {
-        super(properties, parent);
-
-        Preconditions.checkArgument(properties.containsKey("master"), "The Redis master entity must be specified");
-        master = (RedisStore) properties.get("master");
-    }
-
-    @Override
-    public String getConfigData(int port, boolean include) {
-        String masterAddress = master.getAddress();
-        int masterPort = getParent().getAttribute(REDIS_PORT);
-
-        return super.getConfigData(port, include) + "slaveof "+masterAddress+" "+masterPort;
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
new file mode 100644
index 0000000..2ea0783
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
@@ -0,0 +1,42 @@
+package brooklyn.entity.nosql.redis;
+
+import java.util.Map;
+
+import brooklyn.entity.Entity;
+import brooklyn.util.MutableMap;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * A {@link RedisStore} configured as a slave.
+ *
+ * The {@code master} property must be set to the master Redis store entity.
+ */
+public class RedisSlaveImpl extends RedisStoreImpl implements RedisSlave {
+    RedisStore master;
+
+    public RedisSlaveImpl() {
+        this(MutableMap.of(), null);
+    }
+    public RedisSlaveImpl(Map properties) {
+        this(properties, null);
+    }
+    public RedisSlaveImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public RedisSlaveImpl(Map properties, Entity parent) {
+        super(properties, parent);
+
+        // TODO Use config key for "master"
+        Preconditions.checkArgument(properties.containsKey("master"), "The Redis master entity must be specified");
+        master = (RedisStore) properties.get("master");
+    }
+
+    @Override
+    public String getConfigData(int port, boolean include) {
+        String masterAddress = master.getAddress();
+        int masterPort = getParent().getAttribute(REDIS_PORT);
+
+        return super.getConfigData(port, include) + "slaveof "+masterAddress+" "+masterPort;
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
deleted file mode 100644
index 7272088..0000000
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package brooklyn.entity.nosql.redis;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.catalog.Catalog;
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.basic.SoftwareProcessImpl;
-import brooklyn.entity.nosql.DataStore;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.basic.BasicAttributeSensor;
-import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
-import brooklyn.event.basic.BasicConfigKey;
-import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
-import brooklyn.location.MachineLocation;
-import brooklyn.location.basic.SshMachineLocation;
-import brooklyn.util.MutableMap;
-import brooklyn.util.flags.SetFromFlag;
-
-/**
- * An entity that represents a Redis key-value store service.
- *
- * TODO add sensors with Redis statistics using INFO command
- */
-@Catalog(name="Redis Server", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.jpeg")
-public class RedisStore extends SoftwareProcessImpl implements DataStore {
-    protected static final Logger LOG = LoggerFactory.getLogger(RedisStore.class);
-
-    @SetFromFlag("version")
-    public static final BasicConfigKey<String> SUGGESTED_VERSION =
-            new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "2.6.7");
-
-    @SetFromFlag("downloadUrl")
-    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
-            SoftwareProcess.DOWNLOAD_URL, "http://redis.googlecode.com/files/redis-${version}.tar.gz");
-
-    public static final PortAttributeSensorAndConfigKey REDIS_PORT = new PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
-    public static final ConfigKey<String> REDIS_CONFIG_FILE = new BasicConfigKey<String>(String.class, "redis.config.file", "Redis user configuration file");
-    public static final AttributeSensor<Integer> UPTIME = new BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in seconds");
-
-    public RedisStore() {
-        this(MutableMap.of(), null);
-    }
-    public RedisStore(Map properties) {
-        this(properties, null);
-    }
-    public RedisStore(Entity parent) {
-        this(MutableMap.of(), parent);
-    }
-    public RedisStore(Map properties, Entity parent) {
-        super(properties, parent);
-
-        setConfigIfValNonNull(REDIS_PORT, properties.get("redisPort"));
-        setConfigIfValNonNull(REDIS_CONFIG_FILE, properties.get("configFile"));
-    }
-    
-    @Override
-    protected void connectSensors() {
-        super.connectSensors();
-
-        connectServiceUpIsRunning();
-        
-        // TODO IF desired, port this for setting UPTIME (because legacy sshAdapter is deleted)
-//        String output = sshAdapter.newOutputValueProvider("${driver.runDir}/bin/redis-cli info").compute()
-//        for (String line : output.split("\n")) {
-//            if (line =~ /^uptime_in_seconds:/) {
-//                String data = line.trim()
-//                int colon = data.indexOf(":")
-//                return Integer.parseInt(data.substring(colon + 1))
-//            }
-//        }
-    }
-
-    @Override
-    public void disconnectSensors() {
-        super.disconnectSensors();
-        disconnectServiceUpIsRunning();
-    }
-    
-    public Class getDriverInterface() {
-        return RedisStoreDriver.class;
-    }
-
-    @Override
-    public RedisStoreDriver getDriver() {
-        return (RedisStoreDriver) super.getDriver();
-    }
-    
-    public String getAddress() {
-        MachineLocation machine = getMachineOrNull();
-        return (machine != null) ? machine.getAddress().getHostAddress() : null;
-    }
-    
-    
-    // FIXME Don't want to hard-code this as SshMachineLocatoin; want generic way of doing machine.copyTo
-    @Override
-    protected SshMachineLocation getMachineOrNull() {
-        return (SshMachineLocation) super.getMachineOrNull();
-    }
-    
-    // FIXME This logic should all be in the driver
-    void doExtraConfigurationDuringStart() {
-	    int port = getAttribute(REDIS_PORT);
-        boolean include = false;
-
-        String includeName = getConfig(REDIS_CONFIG_FILE);
-        if (includeName != null && includeName.length() > 0) {
-            File includeFile = new File(includeName);
-	        include = includeFile.exists();
-        }
-
-		getMachineOrNull().copyTo(new ByteArrayInputStream(getConfigData(port, include).getBytes()), getDriver().getRunDir()+"/redis.conf");
-        if (include) getMachineOrNull().copyTo(new File(includeName), getDriver().getRunDir()+"/include.conf");
-        
-        super.configure();
-    }
-
-    public String getConfigData(int port, boolean include) {
-        String data = 
-                "daemonize yes"+"\n"+
-                "pidfile "+getDriver().getRunDir()+"/pid.txt"+"\n"+
-                "port "+port+"\n";
-
-        if (include) data += "include "+getDriver().getRunDir()+"/include.conf";
-        return data;
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
new file mode 100644
index 0000000..5c454cd
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
@@ -0,0 +1,109 @@
+package brooklyn.entity.nosql.redis;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.SoftwareProcessImpl;
+import brooklyn.location.MachineLocation;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.util.MutableMap;
+
+/**
+ * An entity that represents a Redis key-value store service.
+ *
+ * TODO add sensors with Redis statistics using INFO command
+ */
+public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
+    protected static final Logger LOG = LoggerFactory.getLogger(RedisStore.class);
+
+    public RedisStoreImpl() {
+        this(MutableMap.of(), null);
+    }
+    public RedisStoreImpl(Map properties) {
+        this(properties, null);
+    }
+    public RedisStoreImpl(Entity parent) {
+        this(MutableMap.of(), parent);
+    }
+    public RedisStoreImpl(Map properties, Entity parent) {
+        super(properties, parent);
+    }
+    
+    @Override
+    protected void connectSensors() {
+        super.connectSensors();
+
+        connectServiceUpIsRunning();
+        
+        // TODO IF desired, port this for setting UPTIME (because legacy sshAdapter is deleted)
+//        String output = sshAdapter.newOutputValueProvider("${driver.runDir}/bin/redis-cli info").compute()
+//        for (String line : output.split("\n")) {
+//            if (line =~ /^uptime_in_seconds:/) {
+//                String data = line.trim()
+//                int colon = data.indexOf(":")
+//                return Integer.parseInt(data.substring(colon + 1))
+//            }
+//        }
+    }
+
+    @Override
+    public void disconnectSensors() {
+        super.disconnectSensors();
+        disconnectServiceUpIsRunning();
+    }
+    
+    public Class getDriverInterface() {
+        return RedisStoreDriver.class;
+    }
+
+    @Override
+    public RedisStoreDriver getDriver() {
+        return (RedisStoreDriver) super.getDriver();
+    }
+    
+    @Override
+    public String getAddress() {
+        MachineLocation machine = getMachineOrNull();
+        return (machine != null) ? machine.getAddress().getHostAddress() : null;
+    }
+    
+    
+    // FIXME Don't want to hard-code this as SshMachineLocatoin; want generic way of doing machine.copyTo
+    @Override
+    protected SshMachineLocation getMachineOrNull() {
+        return (SshMachineLocation) super.getMachineOrNull();
+    }
+    
+    // FIXME This logic should all be in the driver
+    void doExtraConfigurationDuringStart() {
+	    int port = getAttribute(REDIS_PORT);
+        boolean include = false;
+
+        String includeName = getConfig(REDIS_CONFIG_FILE);
+        if (includeName != null && includeName.length() > 0) {
+            File includeFile = new File(includeName);
+	        include = includeFile.exists();
+        }
+
+		getMachineOrNull().copyTo(new ByteArrayInputStream(getConfigData(port, include).getBytes()), getDriver().getRunDir()+"/redis.conf");
+        if (include) getMachineOrNull().copyTo(new File(includeName), getDriver().getRunDir()+"/include.conf");
+        
+        super.configure();
+    }
+
+    @Override
+    public String getConfigData(int port, boolean include) {
+        String data = 
+                "daemonize yes"+"\n"+
+                "pidfile "+getDriver().getRunDir()+"/pid.txt"+"\n"+
+                "port "+port+"\n";
+
+        if (include) data += "include "+getDriver().getRunDir()+"/include.conf";
+        return data;
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 7ae292a..8b8e8ae 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -21,13 +21,13 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
 
     private String expandedInstallDir;
 
-    public RedisStoreSshDriver(RedisStore entity, SshMachineLocation machine) {
+    public RedisStoreSshDriver(RedisStoreImpl entity, SshMachineLocation machine) {
         super(entity, machine);
     }
 
     @Override
-    public RedisStore getEntity() {
-        return (RedisStore) super.getEntity();
+    public RedisStoreImpl getEntity() {
+        return (RedisStoreImpl) super.getEntity();
     }
     
     protected Integer getRedisPort() {

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
index 187f981..a3eeb2f 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
@@ -8,20 +8,28 @@ import org.testng.annotations.Test;
 
 import redis.clients.jedis.Connection;
 import brooklyn.entity.AbstractEc2LiveTest;
+import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.location.Location;
 import brooklyn.test.EntityTestUtils;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class RedisEc2LiveTest extends AbstractEc2LiveTest {
 
     @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(RedisEc2LiveTest.class);
 
+    @Test(groups = {"Live"})
+    public void test_CentOS_6_3() throws Exception {
+        // Image: {id=us-east-1/ami-7d7bfc14, providerId=ami-7d7bfc14, name=RightImage_CentOS_6.3_x64_v5.8.8.5, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=centos, arch=paravirtual, version=6.0, description=rightscale-us-east/RightImage_CentOS_6.3_x64_v5.8.8.5.manifest.xml, is64Bit=true}, description=rightscale-us-east/RightImage_CentOS_6.3_x64_v5.8.8.5.manifest.xml, version=5.8.8.5, status=AVAILABLE[available], loginUser=root, userMetadata={owner=411009282317, rootDeviceType=instance-store, virtualizationType=paravirtual, hypervisor=xen}}
+        runTest(ImmutableMap.of("imageId", "us-east-1/ami-7d7bfc14", "hardwareId", SMALL_HARDWARE_ID));
+    }
+
     @Override
     protected void doTest(Location loc) throws Exception {
         // Start Redis
-        RedisStore redis = new RedisStore(app);
+        RedisStore redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
         app.start(ImmutableList.of(loc));
         EntityTestUtils.assertAttributeEqualsEventually(redis, RedisStore.SERVICE_UP, true);
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c06d64c0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
index c737070..44d9e0e 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.groovy
@@ -10,11 +10,13 @@ import org.testng.annotations.BeforeMethod
 import org.testng.annotations.Test
 
 import redis.clients.jedis.Connection
+import brooklyn.entity.basic.ApplicationBuilder
+import brooklyn.entity.basic.Entities
+import brooklyn.entity.proxying.EntitySpecs
 import brooklyn.entity.trait.Startable
 import brooklyn.location.Location
 import brooklyn.location.basic.LocalhostMachineProvisioningLocation
 import brooklyn.test.entity.TestApplication
-import brooklyn.test.entity.TestApplicationImpl
 import brooklyn.util.internal.TimeExtras
 
 /**
@@ -31,15 +33,15 @@ public class RedisIntegrationTest {
     private Location testLocation
     private RedisStore redis
 
-    @BeforeMethod(groups = "Integration")
+    @BeforeMethod(alwaysRun=true)
     public void setup() {
-        app = new TestApplicationImpl();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation(name:'london')
     }
 
-    @AfterMethod(groups = "Integration")
+    @AfterMethod(alwaysRun=true)
     public void shutdown() {
-        if (app != null) app.stop()
+        if (app != null) Entities.destroyAll(app);
     }
 
     /**
@@ -48,7 +50,7 @@ public class RedisIntegrationTest {
     // FIXME Marked as WIP because failing in jenkins; environmental differences?
     @Test(groups = ["Integration"])
     public void canStartupAndShutdown() {
-        redis = new RedisStore(parent:app);
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
         app.start([ testLocation ])
         executeUntilSucceeds() {
             assertTrue redis.getAttribute(Startable.SERVICE_UP)
@@ -65,7 +67,7 @@ public class RedisIntegrationTest {
     @Test(groups = ["Integration"])
     public void testRedisConnection() {
         // Start Redis
-        redis = new RedisStore(parent:app)
+        redis = app.createAndManageChild(EntitySpecs.spec(RedisStore.class));
         app.start([ testLocation ])
         executeUntilSucceeds {
             assertTrue redis.getAttribute(Startable.SERVICE_UP)


[20/50] brooklyn-library git commit: Added test using Kafka API and example application

Posted by he...@apache.org.
Added test using Kafka API and example application


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/c1437063
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/c1437063
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/c1437063

Branch: refs/heads/0.5.0
Commit: c14370630975d0b83741704f0df266cf7033a6a8
Parents: 37e890c
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Mar 20 19:49:50 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:06 2013 +0100

----------------------------------------------------------------------
 examples/simple-messaging-pubsub/README.txt     |  7 +-
 .../java/brooklyn/demo/KafkaClusterExample.java | 40 +++++++++++
 .../brooklyn/demo/StandaloneBrokerExample.java  | 54 ---------------
 .../demo/StandaloneQpidBrokerExample.java       | 54 +++++++++++++++
 software/messaging/pom.xml                      | 73 +++++++++++++-------
 .../entity/messaging/kafka/KafkaBroker.java     |  4 +-
 .../entity/messaging/kafka/KafkaBrokerImpl.java |  7 +-
 .../entity/messaging/kafka/KafkaZookeeper.java  |  2 +-
 .../messaging/kafka/KafkaIntegrationTest.groovy | 21 ++++--
 .../entity/messaging/kafka/KafkaSupport.java    | 72 +++++++++++++++++++
 10 files changed, 240 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/examples/simple-messaging-pubsub/README.txt
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/README.txt b/examples/simple-messaging-pubsub/README.txt
index 6048867..e27992e 100644
--- a/examples/simple-messaging-pubsub/README.txt
+++ b/examples/simple-messaging-pubsub/README.txt
@@ -7,7 +7,7 @@ The commands below assume that the `brooklyn` script is already on your $PATH, a
   export BROOKLYN_CLASSPATH=$(pwd)/target/classes
   
   # Launches a qpid broker on localhost
-  brooklyn -v launch --app brooklyn.demo.StandaloneBrokerExample --location localhost
+  brooklyn -v launch --app brooklyn.demo.StandaloneQpidBrokerExample --location localhost
 
   # You can get the broker's URL from the brooklyn web-console at http://localhost:8081
   # by looking at the broker entity's sensors or from the verbose output from the application startup
@@ -19,6 +19,11 @@ The commands below assume that the `brooklyn` script is already on your $PATH, a
   # Test publishing a message to the broker
   java -cp "./resources/lib/*:./target/classes" brooklyn.demo.Publish ${URL}
 
+To test a Kafka distributed messaging cluster example, use the following command:
+
+  # Launches a Kafka cluster on AWS EC2 with two brokers
+  brooklyn -v launch --app brooklyn.demo.KafkaClusterExample --location aws-ec2:eu-west-1
+
 ---
 
 For more information, please visit: http://brooklyncentral.github.com/use/examples/messaging/

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
new file mode 100644
index 0000000..fae6bb6
--- /dev/null
+++ b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/KafkaClusterExample.java
@@ -0,0 +1,40 @@
+package brooklyn.demo;
+
+import java.util.List;
+
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.messaging.kafka.KafkaCluster;
+import brooklyn.entity.proxying.BasicEntitySpec;
+import brooklyn.launcher.BrooklynLauncher;
+import brooklyn.util.CommandLineUtil;
+
+import com.google.common.collect.Lists;
+
+/** Kafka Cluster Application */
+public class KafkaClusterExample extends ApplicationBuilder {
+
+    public static final String DEFAULT_LOCATION = "localhost";
+
+    /** Configure the application. */
+    protected void doBuild() {
+        createChild(BasicEntitySpec.newInstance(KafkaCluster.class)
+                .configure("initialSize", 2));
+
+        appDisplayName("Kafka cluster application");
+    }
+
+    public static void main(String[] argv) {
+        List<String> args = Lists.newArrayList(argv);
+        String port =  CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
+        String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
+
+        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
+                .application(new KafkaClusterExample())
+                .webconsolePort(port)
+                .location(location)
+                .start();
+
+        Entities.dumpInfo(launcher.getApplications());
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
deleted file mode 100644
index 83cdc31..0000000
--- a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package brooklyn.demo;
-
-import java.util.List;
-
-import brooklyn.entity.basic.AbstractApplication;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.messaging.amqp.AmqpServer;
-import brooklyn.entity.messaging.qpid.QpidBroker;
-import brooklyn.entity.proxying.EntitySpecs;
-import brooklyn.launcher.BrooklynLauncher;
-import brooklyn.util.CommandLineUtil;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-/** Qpid Broker Application */
-public class StandaloneBrokerExample extends AbstractApplication {
-
-    public static final String CUSTOM_CONFIG_PATH = "classpath://custom-config.xml";
-    public static final String PASSWD_PATH = "classpath://passwd";
-    public static final String QPID_BDBSTORE_JAR_PATH = "classpath://qpid-bdbstore-0.14.jar";
-    public static final String BDBSTORE_JAR_PATH = "classpath://je-5.0.34.jar";
-
-    public static final String DEFAULT_LOCATION = "localhost";
-    
-    @Override
-    public void init() {
-        // Configure the Qpid broker entity
-    	QpidBroker broker = addChild(EntitySpecs.spec(QpidBroker.class)
-    	        .configure("amqpPort", 5672)
-    	        .configure("amqpVersion", AmqpServer.AMQP_0_10)
-    	        .configure("runtimeFiles", ImmutableMap.builder()
-    	                .put(QpidBroker.CONFIG_XML, CUSTOM_CONFIG_PATH)
-    	                .put(QpidBroker.PASSWD, PASSWD_PATH)
-    	                .put("lib/opt/qpid-bdbstore-0.14.jar", QPID_BDBSTORE_JAR_PATH)
-    	                .put("lib/opt/je-5.0.34.jar", BDBSTORE_JAR_PATH)
-    	                .build())
-    	        .configure("queue", "testQueue"));
-    }
-
-    public static void main(String[] argv) {
-        List<String> args = Lists.newArrayList(argv);
-        String port =  CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
-        String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
-
-        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(EntitySpecs.appSpec(StandaloneBrokerExample.class).displayName("Qpid app"))
-                .webconsolePort(port)
-                .location(location)
-                .start();
-         
-        Entities.dumpInfo(launcher.getApplications());
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneQpidBrokerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneQpidBrokerExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneQpidBrokerExample.java
new file mode 100644
index 0000000..19b6c2e
--- /dev/null
+++ b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneQpidBrokerExample.java
@@ -0,0 +1,54 @@
+package brooklyn.demo;
+
+import java.util.List;
+
+import brooklyn.entity.basic.AbstractApplication;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.messaging.amqp.AmqpServer;
+import brooklyn.entity.messaging.qpid.QpidBroker;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.launcher.BrooklynLauncher;
+import brooklyn.util.CommandLineUtil;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
+/** Qpid Broker Application */
+public class StandaloneQpidBrokerExample extends AbstractApplication {
+
+    public static final String CUSTOM_CONFIG_PATH = "classpath://custom-config.xml";
+    public static final String PASSWD_PATH = "classpath://passwd";
+    public static final String QPID_BDBSTORE_JAR_PATH = "classpath://qpid-bdbstore-0.14.jar";
+    public static final String BDBSTORE_JAR_PATH = "classpath://je-5.0.34.jar";
+
+    public static final String DEFAULT_LOCATION = "localhost";
+    
+    @Override
+    public void init() {
+        // Configure the Qpid broker entity
+    	QpidBroker broker = addChild(EntitySpecs.spec(QpidBroker.class)
+    	        .configure("amqpPort", 5672)
+    	        .configure("amqpVersion", AmqpServer.AMQP_0_10)
+    	        .configure("runtimeFiles", ImmutableMap.builder()
+    	                .put(QpidBroker.CONFIG_XML, CUSTOM_CONFIG_PATH)
+    	                .put(QpidBroker.PASSWD, PASSWD_PATH)
+    	                .put("lib/opt/qpid-bdbstore-0.14.jar", QPID_BDBSTORE_JAR_PATH)
+    	                .put("lib/opt/je-5.0.34.jar", BDBSTORE_JAR_PATH)
+    	                .build())
+    	        .configure("queue", "testQueue"));
+    }
+
+    public static void main(String[] argv) {
+        List<String> args = Lists.newArrayList(argv);
+        String port =  CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
+        String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
+
+        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
+                .application(EntitySpecs.appSpec(StandaloneQpidBrokerExample.class).displayName("Qpid app"))
+                .webconsolePort(port)
+                .location(location)
+                .start();
+         
+        Entities.dumpInfo(launcher.getApplications());
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/pom.xml
----------------------------------------------------------------------
diff --git a/software/messaging/pom.xml b/software/messaging/pom.xml
index 4b0f372..7a81336 100644
--- a/software/messaging/pom.xml
+++ b/software/messaging/pom.xml
@@ -14,37 +14,21 @@
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jms_1.1_spec</artifactId>
-            <version>1.1.1</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.qpid</groupId>
-            <artifactId>qpid-client</artifactId>
-            <version>0.20</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.activemq</groupId>
-            <artifactId>activemq-core</artifactId>
-            <version>5.7.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.rabbitmq</groupId>
-            <artifactId>amqp-client</artifactId>
-            <version>2.8.7</version>
-        </dependency>
+    <repositories>
+        <repository>
+            <id>clojars.org</id>
+            <url>http://clojars.org/repo</url>
+        </repository>
+    </repositories>
 
+    <dependencies>
         <dependency>
             <groupId>io.brooklyn</groupId>
             <artifactId>brooklyn-software-base</artifactId>
             <version>${project.version}</version>
         </dependency>
-        
+
+        <!-- test dependencies -->
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>brooklyn-test-support</artifactId>
@@ -64,13 +48,50 @@
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>
-        <!-- bring in jclouds for testing -->
         <dependency>
             <groupId>io.brooklyn</groupId>
             <artifactId>brooklyn-locations-jclouds</artifactId>
             <version>${brooklyn.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <!-- for qpid -->
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jms_1.1_spec</artifactId>
+            <version>1.1.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.qpid</groupId>
+            <artifactId>qpid-client</artifactId>
+            <version>0.20</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- for activemq -->
+        <dependency>
+            <groupId>org.apache.activemq</groupId>
+            <artifactId>activemq-core</artifactId>
+            <version>5.7.0</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- for rabbit -->
+        <dependency>
+            <groupId>com.rabbitmq</groupId>
+            <artifactId>amqp-client</artifactId>
+            <version>2.8.7</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- for kafka -->
+        <dependency>
+            <groupId>storm</groupId>
+            <artifactId>kafka</artifactId>
+            <version>0.7.0-incubating</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
index 13b8d0d..01fa424 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -45,7 +45,7 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
     @SetFromFlag("zookeeper")
     BasicConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "Kafka zookeeper entity");
 
-    AttributeSensor<Long> BROKER_ID = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.id", "Kafka unique broker ID");
+    AttributeSensor<Integer> BROKER_ID = new BasicAttributeSensor<Integer>(Integer.class, "kafka.broker.id", "Kafka unique broker ID");
 
     BasicAttributeSensor<Long> FETCH_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.total", "Fetch request count");
     BasicAttributeSensor<Long> TOTAL_FETCH_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.time.total", "Total fetch request processing time (millis)");
@@ -60,7 +60,7 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
 
     Integer getKafkaPort();
 
-    Long getBrokerId();
+    Integer getBrokerId();
 
     KafkaZookeeper getZookeeper();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index d76072e..ae21118 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -29,6 +29,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.entity.messaging.MessageBroker;
+import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.feed.function.FunctionFeed;
 import brooklyn.event.feed.function.FunctionPollConfig;
 import brooklyn.event.feed.jmx.JmxAttributePollConfig;
@@ -45,8 +46,6 @@ import com.google.common.collect.Sets;
 public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroker, KafkaBroker {
     private static final Logger log = LoggerFactory.getLogger(KafkaBrokerImpl.class);
 
-    private static final AtomicLong brokers = new AtomicLong(0l);
-
     public KafkaBrokerImpl() {
         super();
     }
@@ -62,14 +61,14 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
 
     @Override
     public void postConstruct() {
-        setAttribute(BROKER_ID, brokers.incrementAndGet());
+        setAttribute(BROKER_ID, hashCode());
     }
 
     @Override
     public Integer getKafkaPort() { return getAttribute(KAFKA_PORT); }
 
     @Override
-    public Long getBrokerId() { return getAttribute(BROKER_ID); }
+    public Integer getBrokerId() { return getAttribute(BROKER_ID); }
 
     @Override
     public KafkaZookeeper getZookeeper() { return getConfig(ZOOKEEPER); }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
index 8e1b5da..a1001f3 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
@@ -35,7 +35,7 @@ public interface KafkaZookeeper extends SoftwareProcess, UsesJmx, Kafka {
     @SetFromFlag("zookeeperPort")
     PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
 
-    /** Location of the configuration file template to be copied to the server.*/
+    /** Location of the configuration file template to be copied to the server. */
     @SetFromFlag("zookeeperConfig")
     BasicConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
             String.class, "kafka.config.zookeeper", "Zookeeper configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
index 0943dcd..cbfb410 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
@@ -46,6 +46,8 @@ import brooklyn.util.internal.TimeExtras
 
 /**
  * Test the operation of the {@link ActiveMQBroker} class.
+ *
+ * TODO test that sensors update.
  */
 public class KafkaIntegrationTest {
     private static final Logger log = LoggerFactory.getLogger(KafkaIntegrationTest.class)
@@ -101,20 +103,27 @@ public class KafkaIntegrationTest {
 
     /**
      * Test that we can start a cluster with zookeeper and one broker.
+     *
+     * Connects to the zookeeper controller and tests sending and receiving messages on a topic.
      */
     @Test(groups = "Integration")
     public void testSingleBrokerCluster() {
         KafkaCluster cluster = app.createAndManageChild(BasicEntitySpec.newInstance(KafkaCluster.class).configure(KafkaCluster.INITIAL_SIZE, 1));
 
         cluster.start([ testLocation ])
-        executeUntilSucceedsWithShutdown(cluster, timeout:600*TimeUnit.SECONDS) {
+        executeUntilSucceeds(timeout:600*TimeUnit.SECONDS) {
             assertTrue cluster.getAttribute(Startable.SERVICE_UP)
-            Entities.dumpInfo(cluster)
         }
-        assertFalse cluster.getAttribute(Startable.SERVICE_UP)
+
+        Entities.dumpInfo(cluster);
+
+        Thread.sleep(5000l);
+
+        KafkaSupport support = new KafkaSupport(cluster.getZookeeper());
+        support.sendMessage("brooklyn", "TEST_MESSAGE")
+        List<String> messages = support.getMessage("brooklyn");
+        assertEquals(messages.size(), 1);
+        assertEquals(messages.get(0), "TEST_MESSAGE");
     }
 
-    // TODO test with API sending messages
-    // TODO test that sensors update
-    // TODO add demo application
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c1437063/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
new file mode 100644
index 0000000..d026f06
--- /dev/null
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaSupport.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static org.testng.Assert.*;
+
+import java.util.List;
+import java.util.Properties;
+
+import kafka.consumer.Consumer;
+import kafka.consumer.ConsumerConfig;
+import kafka.consumer.KafkaMessageStream;
+import kafka.javaapi.consumer.ConsumerConnector;
+import kafka.javaapi.producer.Producer;
+import kafka.javaapi.producer.ProducerData;
+import kafka.message.Message;
+import kafka.producer.ProducerConfig;
+import brooklyn.entity.basic.Attributes;
+
+import com.beust.jcommander.internal.Lists;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+public class KafkaSupport {
+
+    private final KafkaZookeeper zookeeper;
+
+    public KafkaSupport(KafkaZookeeper zookeeper) {
+        this.zookeeper = zookeeper;
+    }
+
+    public void sendMessage(String topic, String message) {
+        Properties props = new Properties();
+        props.put("zk.connect", String.format("%s:%d", zookeeper.getAttribute(Attributes.HOSTNAME), zookeeper.getZookeeperPort()));
+        props.put("serializer.class", "kafka.serializer.StringEncoder");
+        ProducerConfig config = new ProducerConfig(props);
+        Producer<String, String> producer = new Producer<String, String>(config);
+        ProducerData<String, String> data = new ProducerData<String, String>(topic, message);
+        producer.send(data);
+        producer.close();
+    }
+
+    public List<String> getMessage(String topic) {
+        Properties props = new Properties();
+        props.put("zk.connect", String.format("%s:%d", zookeeper.getAttribute(Attributes.HOSTNAME), zookeeper.getZookeeperPort()));
+        props.put("zk.connectiontimeout.ms", "1000000");
+        props.put("groupid", "test_group");
+        ConsumerConfig consumerConfig = new ConsumerConfig(props);
+        ConsumerConnector consumer = Consumer.createJavaConsumerConnector(consumerConfig);
+        List<KafkaMessageStream<Message>> streams = consumer.createMessageStreams(ImmutableMap.of(topic, 1)).get(topic);
+        List<String> messages = Lists.newArrayList();
+        for (Message msg : Iterables.getOnlyElement(streams)) {
+            assertTrue(msg.isValid());
+            String payload = new String(msg.payload().array());
+            messages.add(payload);
+          }
+        return messages;
+    }
+}


[49/50] brooklyn-library git commit: AbstractController: use PORT_NUMBER_SENSOR config

Posted by he...@apache.org.
AbstractController: use PORT_NUMBER_SENSOR config

- Previously, it hard-coded HTTP_PORT rather than using
  key specified in the configuration


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/929ee88c
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/929ee88c
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/929ee88c

Branch: refs/heads/0.5.0
Commit: 929ee88c559c2696f48e681d75824c8f62be5640
Parents: 0d9ee80
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 17 14:41:12 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 25 11:24:49 2013 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/entity/proxy/AbstractControllerImpl.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/929ee88c/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
index 4585013..609cfed 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
@@ -150,7 +150,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     }
 
     @Override
-    public AttributeSensor getPortNumberSensor() {
+    public AttributeSensor<Integer> getPortNumberSensor() {
         return getAttribute(PORT_NUMBER_SENSOR);
     }
 
@@ -336,7 +336,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     
     protected String getAddressOfEntity(Entity member) {
         String ip = member.getAttribute(Attributes.HOSTNAME);
-        Integer port = member.getAttribute(Attributes.HTTP_PORT);
+        Integer port = member.getAttribute(getPortNumberSensor());
         if (ip!=null && port!=null) {
             return ip+":"+port;
         }


[23/50] brooklyn-library git commit: Organize imports

Posted by he...@apache.org.
Organize imports


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/dee689a4
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/dee689a4
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/dee689a4

Branch: refs/heads/0.5.0
Commit: dee689a492130ce5117c9a3b5246b7f61cc330de
Parents: 2ca3ea7
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Mar 20 21:49:58 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:06 2013 +0100

----------------------------------------------------------------------
 .../java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java    | 1 -
 .../brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java    | 4 +---
 .../java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java | 2 --
 .../brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java | 2 +-
 4 files changed, 2 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dee689a4/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index 0abdf45..625fe3f 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -22,7 +22,6 @@ import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
-import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dee689a4/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
index e6c9e4e..b3cd0f0 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
@@ -15,10 +15,8 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static java.lang.String.format;
 
-import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -50,7 +48,7 @@ public class KafkaBrokerSshDriver extends JavaSoftwareProcessSshDriver implement
     }
 
     @Override
-    protected String getLogFileLocation() { return getRunDir()+"/kafka-log"; }
+    protected String getLogFileLocation() { return getRunDir()+"/console.out"; }
 
     @Override
     public Integer getKafkaPort() { return entity.getAttribute(KafkaBroker.KAFKA_PORT); }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dee689a4/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
index a572a75..8d9d4f4 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -29,7 +29,6 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.SoftwareProcessImpl;
-import brooklyn.entity.messaging.qpid.QpidBroker;
 import brooklyn.event.feed.function.FunctionFeed;
 import brooklyn.event.feed.function.FunctionPollConfig;
 import brooklyn.event.feed.jmx.JmxAttributePollConfig;
@@ -38,7 +37,6 @@ import brooklyn.event.feed.jmx.JmxHelper;
 import brooklyn.util.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
 
-import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.collect.Sets;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dee689a4/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
index 4310489..bbaaa0d 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
@@ -44,7 +44,7 @@ public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implem
     }
 
     @Override
-    protected String getLogFileLocation() { return getRunDir()+"/kafka-log"; }
+    protected String getLogFileLocation() { return getRunDir()+"/console.out"; }
 
     @Override
     public Integer getZookeeperPort() { return entity.getAttribute(KafkaZookeeper.ZOOKEEPER_PORT); }


[41/50] brooklyn-library git commit: Redis: add missing interfaces

Posted by he...@apache.org.
Redis: add missing interfaces


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/e4098ab6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/e4098ab6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/e4098ab6

Branch: refs/heads/0.5.0
Commit: e4098ab6d71c4a1c64d316861e1b728c7da81479
Parents: c06d64c
Author: Aled Sage <al...@gmail.com>
Authored: Mon Apr 22 13:09:04 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:44 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisCluster.java        | 19 +++++++++
 .../brooklyn/entity/nosql/redis/RedisShard.java |  9 ++++
 .../brooklyn/entity/nosql/redis/RedisSlave.java | 12 ++++++
 .../brooklyn/entity/nosql/redis/RedisStore.java | 43 ++++++++++++++++++++
 .../entity/nosql/redis/RedisEc2LiveTest.java    |  3 +-
 5 files changed, 85 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e4098ab6/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
new file mode 100644
index 0000000..57b3682
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisCluster.java
@@ -0,0 +1,19 @@
+package brooklyn.entity.nosql.redis;
+
+import brooklyn.catalog.Catalog;
+import brooklyn.entity.Entity;
+import brooklyn.entity.group.DynamicCluster;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.entity.trait.Startable;
+
+/**
+ * A cluster of {@link RedisStore}s with one master and a group of slaves.
+ *
+ * The slaves are contained in a {@link DynamicCluster} which can be resized by a policy if required.
+ *
+ * TODO add sensors with aggregated Redis statistics from cluster
+ */
+@Catalog(name="Redis Cluster", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.jpeg")
+@ImplementedBy(RedisClusterImpl.class)
+public interface RedisCluster extends Entity, Startable {
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e4098ab6/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
new file mode 100644
index 0000000..7ce30c0
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShard.java
@@ -0,0 +1,9 @@
+package brooklyn.entity.nosql.redis;
+
+import brooklyn.entity.Entity;
+import brooklyn.entity.nosql.Shard;
+import brooklyn.entity.proxying.ImplementedBy;
+
+@ImplementedBy(RedisShardImpl.class)
+public interface RedisShard extends Entity, Shard {
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e4098ab6/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
new file mode 100644
index 0000000..d433688
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlave.java
@@ -0,0 +1,12 @@
+package brooklyn.entity.nosql.redis;
+
+import brooklyn.entity.proxying.ImplementedBy;
+
+/**
+ * A {@link RedisStore} configured as a slave.
+ *
+ * The {@code master} property must be set to the master Redis store entity.
+ */
+@ImplementedBy(RedisSlaveImpl.class)
+public interface RedisSlave extends RedisStore {
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e4098ab6/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
new file mode 100644
index 0000000..a6ce441
--- /dev/null
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
@@ -0,0 +1,43 @@
+package brooklyn.entity.nosql.redis;
+
+import brooklyn.catalog.Catalog;
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.SoftwareProcess;
+import brooklyn.entity.nosql.DataStore;
+import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.AttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensor;
+import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * An entity that represents a Redis key-value store service.
+ *
+ * TODO add sensors with Redis statistics using INFO command
+ */
+@Catalog(name="Redis Server", description="Redis is an open-source, networked, in-memory, key-value data store with optional durability", iconUrl="classpath:///redis-logo.jpeg")
+@ImplementedBy(RedisStoreImpl.class)
+public interface RedisStore extends SoftwareProcess, DataStore {
+
+    @SetFromFlag("version")
+    public static final BasicConfigKey<String> SUGGESTED_VERSION =
+            new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "2.6.7");
+
+    @SetFromFlag("downloadUrl")
+    public static final BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
+            SoftwareProcess.DOWNLOAD_URL, "http://redis.googlecode.com/files/redis-${version}.tar.gz");
+
+    @SetFromFlag("redisPort")
+    public static final PortAttributeSensorAndConfigKey REDIS_PORT = new PortAttributeSensorAndConfigKey("redis.port", "Redis port number", 6379);
+    
+    @SetFromFlag("configFile")
+    public static final ConfigKey<String> REDIS_CONFIG_FILE = new BasicConfigKey<String>(String.class, "redis.config.file", "Redis user configuration file");
+    
+    public static final AttributeSensor<Integer> UPTIME = new BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in seconds");
+
+    public String getAddress();
+    
+    public String getConfigData(int port, boolean include);
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/e4098ab6/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
index a3eeb2f..d49fee5 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
@@ -40,8 +40,9 @@ public class RedisEc2LiveTest extends AbstractEc2LiveTest {
     }
 
     private Connection getRedisConnection(RedisStore redis) {
+        String hostname = redis.getAttribute(RedisStore.HOSTNAME);
         int port = redis.getAttribute(RedisStore.REDIS_PORT);
-        Connection connection = new Connection("localhost", port);
+        Connection connection = new Connection(hostname, port);
         connection.connect();
         return connection;
     }


[40/50] brooklyn-library git commit: Fixing build commands to install Redis

Posted by he...@apache.org.
Fixing build commands to install Redis


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/464ef006
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/464ef006
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/464ef006

Branch: refs/heads/0.5.0
Commit: 464ef0063caa3ecbb2786fbae12c3e00721a7bb9
Parents: c65577e
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Sat Apr 20 17:29:44 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:43 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/nosql/redis/RedisStoreSshDriver.java    | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/464ef006/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 6efccdb..7ae292a 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -5,11 +5,12 @@ import static java.lang.String.format;
 import java.util.List;
 
 import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-import brooklyn.entity.basic.lifecycle.CommonCommands;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.location.Location;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
+import brooklyn.util.ssh.CommonCommands;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,7 +41,7 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
     
     @Override
     public void install() {
-        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
+        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
         expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("redis-%s", getVersion()));
@@ -48,12 +49,10 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(CommonCommands.downloadUrlAs(urls, saveAs))
                 .add(CommonCommands.INSTALL_TAR)
-                .add(CommonCommands.installPackage(MutableMap.of("apt", "libjemalloc-dev", "yum", "jemalloc-devel", "port", null, "brew", null), null))
                 .add("tar xzfv " + saveAs)
                 .add(format("cd redis-%s", getVersion()))
                 .add("make distclean")
-                .add("cd deps; make hiredis lua jemalloc linenoise; cd ..")
-                .add("make LDFLAGS=\"-all-static\"")
+                .add("make")
                 .build();
 
         newScript(INSTALLING)


[04/50] brooklyn-library git commit: Merge pull request #627 from grkvlt/wait-for-server-up

Posted by he...@apache.org.
Merge pull request #627 from grkvlt/wait-for-server-up

Make startup timeout configurable and connect SERVICE_UP to isRunning

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/720c93cd
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/720c93cd
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/720c93cd

Branch: refs/heads/0.5.0
Commit: 720c93cdb8b958e57a9251a56d97563e99ad7bd6
Parents: a179334 8fa6840
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 04:06:21 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 04:06:21 2013 -0700

----------------------------------------------------------------------
 .../entity/database/derby/DerbyDatabase.java    | 14 +++++------
 .../database/rubyrep/RubyRepNodeImpl.java       | 20 +++-------------
 .../entity/messaging/qpid/QpidBrokerImpl.java   |  3 +--
 .../messaging/rabbit/RabbitBrokerImpl.java      | 25 +++++++++-----------
 .../entity/nosql/couchdb/CouchDBNodeImpl.java   | 17 +++----------
 .../entity/nosql/mongodb/MongoDbServerImpl.java | 16 +++----------
 .../brooklyn/entity/nosql/redis/RedisStore.java | 17 ++++++-------
 7 files changed, 36 insertions(+), 76 deletions(-)
----------------------------------------------------------------------



[38/50] brooklyn-library git commit: Add one minute timeout to RabbitMQ integration test

Posted by he...@apache.org.
Add one minute timeout to RabbitMQ integration test


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/c65577e9
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/c65577e9
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/c65577e9

Branch: refs/heads/0.5.0
Commit: c65577e9eb7447ac8a9403f53f6a63bac9403bb5
Parents: 4b5d145
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Apr 24 13:09:07 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:09:07 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/c65577e9/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
index 94aeb0f..1ad3597 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
@@ -101,7 +101,7 @@ public class RabbitIntegrationTest {
             QueueingConsumer queueConsumer = new QueueingConsumer(consumer);
             consumer.basicConsume(queue, true, queueConsumer);
         
-            QueueingConsumer.Delivery delivery = queueConsumer.nextDelivery();
+            QueueingConsumer.Delivery delivery = queueConsumer.nextDelivery(60 * 1000l); // one minute timeout
             assertEquals(delivery.body, content)
         } finally {
 	        producer?.close()


[24/50] brooklyn-library git commit: Added EC2 live test for KafkaCluster

Posted by he...@apache.org.
Added EC2 live test for KafkaCluster


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/317363ab
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/317363ab
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/317363ab

Branch: refs/heads/0.5.0
Commit: 317363ab745e7f660d27d29abf4808650483fcd3
Parents: 64486e4
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Apr 3 12:37:09 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../entity/messaging/kafka/KafkaLiveTest.java   | 37 ++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/317363ab/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
index 6229b4e..8f61400 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaLiveTest.java
@@ -15,17 +15,50 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.concurrent.Callable;
+
 import brooklyn.entity.AbstractEc2LiveTest;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.entity.trait.Startable;
 import brooklyn.location.Location;
+import brooklyn.test.Asserts;
+import brooklyn.util.MutableMap;
+
+import com.google.common.collect.ImmutableList;
 
 public class KafkaLiveTest extends AbstractEc2LiveTest {
 
     /**
-     * Test Kafka cluster operation.
+     * Test that can install, start and use a Kafka cluster with two brokers.
      */
     @Override
     protected void doTest(Location loc) throws Exception {
-        throw new UnsupportedOperationException();
+        final KafkaCluster cluster = app.createAndManageChild(EntitySpecs.spec(KafkaCluster.class)
+                .configure("startTimeout", 300) // 5 minutes
+                .configure("initialSize", 2));
+        app.start(ImmutableList.of(loc));
+
+        Asserts.succeedsEventually(MutableMap.of("timeout", 300000l), new Callable<Void>() {
+            @Override
+            public Void call() {
+                assertTrue(cluster.getAttribute(Startable.SERVICE_UP));
+                assertTrue(cluster.getZookeeper().getAttribute(Startable.SERVICE_UP));
+                assertEquals(cluster.getCurrentSize().intValue(), 2);
+                return null;
+            }
+        });
+
+        Entities.dumpInfo(cluster);
+
+        KafkaSupport support = new KafkaSupport(cluster);
+
+        support.sendMessage("brooklyn", "TEST_MESSAGE");
+        String message = support.getMessage("brooklyn");
+        assertEquals(message, "TEST_MESSAGE");
     }
 
 }


[32/50] brooklyn-library git commit: Updated Tomcat to 7.0.39

Posted by he...@apache.org.
Updated Tomcat to 7.0.39


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/96465a40
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/96465a40
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/96465a40

Branch: refs/heads/0.5.0
Commit: 96465a40142fcc1aec0f3e32428aa5cf6180cd35
Parents: 74e4016
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Fri Apr 19 12:22:12 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 12:22:55 2013 +0100

----------------------------------------------------------------------
 .../src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/96465a40/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java
index 0b46566..241fd20 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServer.java
@@ -40,7 +40,7 @@ public interface TomcatServer extends JavaWebAppSoftwareProcess, UsesJmx, HasSho
     }
 
     @SetFromFlag("version")
-    BasicConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "7.0.37");
+    BasicConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "7.0.39");
 
     @SetFromFlag("downloadUrl")
     BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(


[07/50] brooklyn-library git commit: Merge pull request #626 from ahgittin/misc

Posted by he...@apache.org.
Merge pull request #626 from ahgittin/misc

HttpLatencyDetector

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/8c9b039e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/8c9b039e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/8c9b039e

Branch: refs/heads/0.5.0
Commit: 8c9b039e848bfd57eacccb2f520944494cb9666a
Parents: ca73363 f10cb8a
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 08:49:23 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 08:49:23 2013 -0700

----------------------------------------------------------------------
 .../extras/whirr/WebClusterWithHadoopExample.java     | 14 ++------------
 .../extras/whirr/WebFabricWithHadoopExample.java      | 14 ++------------
 .../brooklyn/demo/WebClusterDatabaseExampleApp.java   | 12 +++++++++++-
 3 files changed, 15 insertions(+), 25 deletions(-)
----------------------------------------------------------------------



[44/50] brooklyn-library git commit: Better testing with Jedis API

Posted by he...@apache.org.
Better testing with Jedis API


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/657047f0
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/657047f0
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/657047f0

Branch: refs/heads/0.5.0
Commit: 657047f053938eb768e689147fe3e1cf2c6fb6a9
Parents: 79e666f
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Mon Apr 22 18:06:29 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:44 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/JedisSupport.java        | 63 ++++++++++++++++++++
 .../entity/nosql/redis/RedisEc2LiveTest.java    |  2 +-
 .../nosql/redis/RedisIntegrationTest.java       |  2 +-
 .../entity/nosql/redis/RedisSupport.java        | 41 -------------
 4 files changed, 65 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/657047f0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
new file mode 100644
index 0000000..d481136
--- /dev/null
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012-2013 by Cloudsoft Corp.
+ */
+package brooklyn.entity.nosql.redis;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPubSub;
+
+/**
+ * {@link RedisStore} testing using Jedis API.
+ */
+public class JedisSupport {
+    private static final Logger log = LoggerFactory.getLogger(JedisSupport.class);
+
+    private RedisStore redis;
+
+    public JedisSupport(RedisStore redis) {
+        this.redis = redis;
+    }
+
+    /**
+     * Exercise the {@link RedisStore} using the Jedis API.
+     */
+    public void redisTest() throws Exception {
+        final CountDownLatch latch = new CountDownLatch(1);
+        Jedis client = getRedisClient(redis);
+        client.subscribe(new JedisPubSub() {
+            public void onMessage(String channel, String message) {
+                assertEquals(channel, "brooklyn");
+                assertEquals(message, "message");
+                latch.countDown();
+            }
+            public void onSubscribe(String channel, int subscribedChannels) { }
+            public void onUnsubscribe(String channel, int subscribedChannels) { }
+            public void onPSubscribe(String pattern, int subscribedChannels) { }
+            public void onPUnsubscribe(String pattern, int subscribedChannels) { }
+            public void onPMessage(String pattern, String channel, String message) { }
+        }, "brooklyn");
+
+        client.publish("brooklyn", "message");
+
+        assertTrue(latch.await(60, TimeUnit.SECONDS));
+        client.disconnect();
+    }
+
+    private Jedis getRedisClient(RedisStore redis) {
+        int port = redis.getAttribute(RedisStore.REDIS_PORT);
+        String host = redis.getAttribute(RedisStore.HOSTNAME);
+        Jedis client = new Jedis(host, port);
+        client.connect();
+        assertTrue(client.isConnected());
+        return client;
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/657047f0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
index eb49ac9..e9365f3 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisEc2LiveTest.java
@@ -29,7 +29,7 @@ public class RedisEc2LiveTest extends AbstractEc2LiveTest {
         app.start(ImmutableList.of(loc));
         EntityTestUtils.assertAttributeEqualsEventually(redis, RedisStore.SERVICE_UP, true);
 
-        RedisSupport support = new RedisSupport(redis);
+        JedisSupport support = new JedisSupport(redis);
         try {
             support.redisTest();
         } finally {

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/657047f0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
index 1ddfa92..35b6a9e 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisIntegrationTest.java
@@ -66,7 +66,7 @@ public class RedisIntegrationTest {
 
         EntityTestUtils.assertAttributeEqualsEventually(redis, Startable.SERVICE_UP, true);
 
-        RedisSupport support = new RedisSupport(redis);
+        JedisSupport support = new JedisSupport(redis);
         try {
             support.redisTest();
         } finally {

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/657047f0/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
deleted file mode 100644
index f617922..0000000
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/RedisSupport.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2012-2013 by Cloudsoft Corp.
- */
-package brooklyn.entity.nosql.redis;
-
-import static org.testng.Assert.assertTrue;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import redis.clients.jedis.Connection;
-
-/**
- * {@link RedisStore} testing using Redis API.
- */
-public class RedisSupport {
-    private static final Logger log = LoggerFactory.getLogger(RedisSupport.class);
-
-    private RedisStore redis;
-
-    public RedisSupport(RedisStore redis) {
-        this.redis = redis;
-    }
-
-    /**
-     * Exercise the {@link RedisStore} using the Redis API.
-     */
-    public void redisTest() throws Exception {
-        // Access Redis
-        Connection connection = getRedisConnection(redis);
-        assertTrue(connection.isConnected());
-        connection.disconnect();
-    }
-
-    private Connection getRedisConnection(RedisStore redis) {
-        int port = redis.getAttribute(RedisStore.REDIS_PORT);
-        Connection connection = new Connection("localhost", port);
-        connection.connect();
-        return connection;
-    }
-}


[31/50] brooklyn-library git commit: Use new method in Entities class to get download resolver

Posted by he...@apache.org.
Use new method in Entities class to get download resolver


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/400e17f2
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/400e17f2
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/400e17f2

Branch: refs/heads/0.5.0
Commit: 400e17f2274307e087f8725a3ca476e1ca634da4
Parents: 317363a
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Apr 4 12:08:34 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:37:17 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java  | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/400e17f2/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
index 21e7092..2686140 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
@@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.BrooklynVersion;
 import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.util.ssh.CommonCommands;
 import brooklyn.entity.drivers.downloads.DownloadResolver;
@@ -69,7 +70,7 @@ public abstract class AbstractfKafkaSshDriver extends JavaSoftwareProcessSshDriv
 
     @Override
     public void install() {
-        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
+        DownloadResolver resolver = Entities.newDownloader(this);
         List<String> urls = resolver.getTargets();
         String saveAs = resolver.getFilename();
         expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));


[36/50] brooklyn-library git commit: Fix until clause in groovy WebAppIntegrationTest to return boolean

Posted by he...@apache.org.
Fix until clause in groovy WebAppIntegrationTest to return boolean


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/d99e0868
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/d99e0868
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/d99e0868

Branch: refs/heads/0.5.0
Commit: d99e0868f70aa7253dd2f37acb72d7da9e649102
Parents: 1dc5a60
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Fri Apr 19 21:14:57 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 21:14:57 2013 +0100

----------------------------------------------------------------------
 .../test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/d99e0868/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
index f9414d1..8d4a153 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
@@ -105,7 +105,7 @@ public class WebAppIntegrationTest {
                         gotException = null
                     }
                 .every(100 * MILLISECONDS)
-                .until { gotException }
+                .until { gotException != null }
                 .limitIterationsTo(25)
                 .run();
     


[16/50] brooklyn-library git commit: Remove old monitored-cassandra-cluster example project

Posted by he...@apache.org.
Remove old monitored-cassandra-cluster example project


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/8ff050ff
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/8ff050ff
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/8ff050ff

Branch: refs/heads/0.5.0
Commit: 8ff050ff814f5ff1612f42f765192de43e9086c1
Parents: 32a6eba
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Apr 10 14:49:53 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 10 15:14:57 2013 +0100

----------------------------------------------------------------------
 .../demo/MonitoredCassandraClusterExample.java  | 20 --------------------
 1 file changed, 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8ff050ff/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
deleted file mode 100644
index 9c543e3..0000000
--- a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package brooklyn.demo;
-
-import brooklyn.entity.basic.AbstractApplication;
-import brooklyn.entity.nosql.cassandra.CassandraCluster;
-import brooklyn.entity.proxying.EntitySpecs;
-
-/** Cassandra Application */
-public class MonitoredCassandraClusterExample extends AbstractApplication {
-
-    @Override
-    public void init() {
-        addChild(EntitySpecs.spec(CassandraCluster.class)
-                .configure("initialSize", "2")
-                .configure("clusterName", "CassandraDemo")
-                .configure("jmxPort", "11099+")
-                .configure("rmiServerPort", "9001+")
-                .configure("thriftPort", "9160+"));
-    }
-
-}


[46/50] brooklyn-library git commit: Synchronous test using Jedis API

Posted by he...@apache.org.
Synchronous test using Jedis API


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/387cc271
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/387cc271
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/387cc271

Branch: refs/heads/0.5.0
Commit: 387cc27178f4087b087ffbab0ec082982f2e7d53
Parents: dc04ab2
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Apr 23 01:41:19 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:45 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/JedisSupport.java        | 42 ++++++++------------
 1 file changed, 16 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/387cc271/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
index d481136..e086188 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/redis/JedisSupport.java
@@ -5,21 +5,15 @@ package brooklyn.entity.nosql.redis;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPubSub;
+
+import com.google.common.base.Strings;
 
 /**
  * {@link RedisStore} testing using Jedis API.
  */
 public class JedisSupport {
-    private static final Logger log = LoggerFactory.getLogger(JedisSupport.class);
+    private static final String TEST_DATA = Strings.repeat("0123456789", 16);
 
     private RedisStore redis;
 
@@ -31,25 +25,21 @@ public class JedisSupport {
      * Exercise the {@link RedisStore} using the Jedis API.
      */
     public void redisTest() throws Exception {
-        final CountDownLatch latch = new CountDownLatch(1);
+        writeData(TEST_DATA);
+        String result = readData();
+        assertEquals(result, TEST_DATA);
+    }
+    public void writeData(String data) throws Exception {
+        Jedis client = getRedisClient(redis);
+        client.set("brooklyn", data);
+        client.disconnect();
+    }
+
+    public String readData() throws Exception {
         Jedis client = getRedisClient(redis);
-        client.subscribe(new JedisPubSub() {
-            public void onMessage(String channel, String message) {
-                assertEquals(channel, "brooklyn");
-                assertEquals(message, "message");
-                latch.countDown();
-            }
-            public void onSubscribe(String channel, int subscribedChannels) { }
-            public void onUnsubscribe(String channel, int subscribedChannels) { }
-            public void onPSubscribe(String pattern, int subscribedChannels) { }
-            public void onPUnsubscribe(String pattern, int subscribedChannels) { }
-            public void onPMessage(String pattern, String channel, String message) { }
-        }, "brooklyn");
-
-        client.publish("brooklyn", "message");
-
-        assertTrue(latch.await(60, TimeUnit.SECONDS));
+        String result = client.get("brooklyn");
         client.disconnect();
+        return result;
     }
 
     private Jedis getRedisClient(RedisStore redis) {


[47/50] brooklyn-library git commit: geo-dns: update member list of entity.hostname changes

Posted by he...@apache.org.
geo-dns: update member list of entity.hostname changes

- Useful for some private subnet examples, where the hostname/url
  gets transformed.
- Transforms tests from groovy to Java.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/8d1b5d2b
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/8d1b5d2b
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/8d1b5d2b

Branch: refs/heads/0.5.0
Commit: 8d1b5d2b8e40a882f9f396ae9f4673ee1a30150b
Parents: 387cc27
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 17 14:38:04 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 25 11:18:21 2013 +0100

----------------------------------------------------------------------
 .../entity/dns/AbstractGeoDnsServiceImpl.java   |  78 +++++----
 .../entity/dns/AbstractGeoDnsServiceTest.groovy | 152 -----------------
 .../entity/dns/AbstractGeoDnsServiceTest.java   | 166 +++++++++++++++++++
 .../geoscaling/GeoscalingIntegrationTest.groovy |  67 --------
 .../geoscaling/GeoscalingIntegrationTest.java   |  86 ++++++++++
 5 files changed, 301 insertions(+), 248 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8d1b5d2b/software/webapp/src/main/java/brooklyn/entity/dns/AbstractGeoDnsServiceImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/dns/AbstractGeoDnsServiceImpl.java b/software/webapp/src/main/java/brooklyn/entity/dns/AbstractGeoDnsServiceImpl.java
index 55be2c0..959c277 100644
--- a/software/webapp/src/main/java/brooklyn/entity/dns/AbstractGeoDnsServiceImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/dns/AbstractGeoDnsServiceImpl.java
@@ -3,6 +3,7 @@ package brooklyn.entity.dns;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.net.InetAddress;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Collection;
 import java.util.Collections;
@@ -154,8 +155,8 @@ public abstract class AbstractGeoDnsServiceImpl extends AbstractEntity implement
             boolean changed = false;
             Set<Entity> previousOnes = MutableSet.copyOf(targetHosts.keySet());
             for (Entity e: pool) {
-                if (previousOnes.remove(e)) continue;
-                changed |= addTargetHost(e, false);
+                previousOnes.remove(e);
+                changed |= addTargetHost(e);
             }
             //anything left in previousOnes is no longer applicable
             for (Entity e: previousOnes) {
@@ -171,44 +172,39 @@ public abstract class AbstractGeoDnsServiceImpl extends AbstractEntity implement
         }
     }
     
-    /** returns if host is added */
-    protected boolean addTargetHost(Entity e, boolean doUpdate) {
-        if (targetHosts.containsKey(e)) {
-            log.warn("GeoDns ignoring already-added entity {}", e);
-            return false;
-        }
-        //add it if it is valid
+    /**
+     * Adds this host, if it is absent or if its hostname has changed.
+     *  
+     * @return true if host is added or changed
+     */
+    protected boolean addTargetHost(Entity e) {
         try {
-            String hostname = e.getAttribute(Attributes.HOSTNAME);
-            String url = e.getAttribute(WebAppService.ROOT_URL);
-            if (url!=null) {
-                URL u = new URL(url);
-                if (hostname==null) {
-                    if (!entitiesWithoutGeoInfo.contains(e))  //don't log repeatedly
-                        log.warn("GeoDns using URL {} to redirect to {} (HOSTNAME attribute is preferred, but not available)", url, e);
-                    hostname = u.getHost(); 
-                }
-                if (u.getPort() > 0 && u.getPort() != 80 && u.getPort() != 443) {
-                    if (!entitiesWithoutGeoInfo.contains(e))  //don't log repeatedly
-                        log.warn("GeoDns detected non-standard port in URL {} for {}; forwarding may not work", url, e);
-                }
-            }
-            if (hostname==null) {
+            HostGeoInfo oldGeo = targetHosts.get(e);
+            String hostname = inferHostname(e);
+            HostGeoInfo geoH = (hostname == null) ? null : HostGeoInfo.fromIpAddress(InetAddress.getByName(hostname));
+
+            if (hostname == null) {
                 if (entitiesWithoutGeoInfo.add(e)) {
                     log.debug("GeoDns ignoring {}, will continue scanning (no hostname or URL available)", e);
                 }
                 return false;
             }
-            HostGeoInfo geoH = HostGeoInfo.fromIpAddress(InetAddress.getByName(hostname));
+            
             if (geoH == null) {
                 if (entitiesWithoutGeoInfo.add(e)) {
                     log.warn("GeoDns ignoring {} (no geography info available for {})", e, hostname);
                 }
                 return false;
             }
+            
+            // If we already knew about it, and it hasn't changed, then nothing to do
+            if (oldGeo != null && geoH.getAddress().equals(oldGeo.getAddress())) {
+                return false;
+            }
+            
+            // Check if location has lat/lon explicitly set; use geo-dns but warn if dramatically different
             HostGeoInfo geoE = HostGeoInfo.fromEntity(e);
-            if (geoE!=null) {
-                //geo info set for both; prefer H, but warn if they differ dramatially
+            if (geoE != null) {
                 if ((Math.abs(geoH.latitude-geoE.latitude)>3) ||
                         (Math.abs(geoH.longitude-geoE.longitude)>3) ) {
                     log.warn("GeoDns mismatch, {} is in {} but hosts URL in {}", new Object[] {e, geoE, geoH});
@@ -216,10 +212,10 @@ public abstract class AbstractGeoDnsServiceImpl extends AbstractEntity implement
             }
             
             entitiesWithoutGeoInfo.remove(e);
-            log.info("GeoDns adding "+e+" at "+geoH+(url!=null ? " (downstream listening on "+url+")" : ""));
+            log.info("GeoDns adding "+e+" at "+geoH+(oldGeo != null ? " (previously "+oldGeo+")" : ""));
             targetHosts.put(e, geoH);
-            if (doUpdate) update();
             return true;
+
         } catch (Exception ee) {
             log.warn("GeoDns ignoring {} (error analysing location, {}", e, ee);
             return false;
@@ -250,4 +246,28 @@ public abstract class AbstractGeoDnsServiceImpl extends AbstractEntity implement
         setAttribute(TARGETS, entityIdToUrl);
     }
     
+    protected String inferHostname(Entity entity) {
+        String hostname = entity.getAttribute(Attributes.HOSTNAME);
+        String url = entity.getAttribute(WebAppService.ROOT_URL);
+        if (url!=null) {
+            try {
+                URL u = new URL(url);
+                
+                if (hostname==null) {
+                    if (!entitiesWithoutGeoInfo.contains(entity))  //don't log repeatedly
+                        log.warn("GeoDns using URL {} to redirect to {} (HOSTNAME attribute is preferred, but not available)", url, entity);
+                    hostname = u.getHost(); 
+                }
+                
+                if (u.getPort() > 0 && u.getPort() != 80 && u.getPort() != 443) {
+                    if (!entitiesWithoutGeoInfo.contains(entity))  //don't log repeatedly
+                        log.warn("GeoDns detected non-standard port in URL {} for {}; forwarding may not work", url, entity);
+                }
+                
+            } catch (MalformedURLException e) {
+                LOG.warn("Invalid URL {} for entity {} in {}", new Object[] {url, entity, this});
+            }
+        }
+        return hostname;
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8d1b5d2b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
deleted file mode 100644
index bba6b3b..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
+++ /dev/null
@@ -1,152 +0,0 @@
-package brooklyn.entity.dns;
-
-import static java.util.concurrent.TimeUnit.*
-import static org.testng.Assert.*
-
-import java.util.concurrent.TimeUnit
-
-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.basic.ApplicationBuilder
-import brooklyn.entity.basic.DynamicGroup
-import brooklyn.entity.basic.Entities
-import brooklyn.entity.group.DynamicFabric
-import brooklyn.entity.proxying.EntitySpecs
-import brooklyn.location.Location
-import brooklyn.location.basic.SimulatedLocation
-import brooklyn.location.basic.SshMachineLocation
-import brooklyn.location.geo.HostGeoInfo
-import brooklyn.test.entity.TestApplication
-import brooklyn.test.entity.TestEntity
-import brooklyn.test.entity.TestEntityImpl
-import brooklyn.util.internal.Repeater
-import brooklyn.util.internal.TimeExtras
-
-import com.google.common.base.Predicates
-import com.google.common.collect.Iterables
-
-public class AbstractGeoDnsServiceTest {
-    public static final Logger log = LoggerFactory.getLogger(AbstractGeoDnsServiceTest.class);
-    static { TimeExtras.init() }
-
-    private static final String WEST_IP = "208.95.232.123";
-    private static final String EAST_IP = "216.150.144.82";
-    private static final double WEST_LATITUDE = 37.43472, WEST_LONGITUDE = -121.89500;
-    private static final double EAST_LATITUDE = 41.10361, EAST_LONGITUDE = -73.79583;
-    
-    private static final Location WEST_PARENT = new SimulatedLocation(
-        name: "West parent", latitude: WEST_LATITUDE, longitude: WEST_LONGITUDE);
-    private static final Location WEST_CHILD = new SshMachineLocation(
-        name: "West child", address: WEST_IP, parentLocation: WEST_PARENT); 
-    private static final Location WEST_CHILD_WITH_LOCATION = new SshMachineLocation(
-        name: "West child with location", address: WEST_IP, parentLocation: WEST_PARENT,
-        latitude: WEST_LATITUDE, longitude: WEST_LONGITUDE); 
-    
-    private static final Location EAST_PARENT = new SimulatedLocation(
-        name: "East parent", latitude: EAST_LATITUDE, longitude: EAST_LONGITUDE);
-    private static final Location EAST_CHILD = new SshMachineLocation(
-        name: "East child", address: EAST_IP, parentLocation: EAST_PARENT); 
-    private static final Location EAST_CHILD_WITH_LOCATION = new SshMachineLocation(
-        name: "East child with location", address: EAST_IP, parentLocation: EAST_PARENT,
-        latitude: EAST_LATITUDE, longitude: EAST_LONGITUDE); 
-    
-    private TestApplication app;
-    private DynamicFabric fabric;
-    private DynamicGroup testEntities;
-    private GeoDnsTestService geoDns;
-    
-
-    @BeforeMethod(alwaysRun=true)
-    public void setup() {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        fabric = app.createAndManageChild(EntitySpecs.spec(DynamicFabric.class)
-            .configure("factory", { properties -> new TestEntityImpl(properties) }));
-        
-        testEntities = app.createAndManageChild(EntitySpecs.spec(DynamicGroup.class)
-            .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class)));
-        geoDns = new GeoDnsTestService(app, polPeriod:10);
-        geoDns.setTargetEntityProvider(testEntities);
-        Entities.startManagement(geoDns);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void shutdown() {
-        if (app != null) Entities.destroy(app);
-    }
-
-    
-    @Test
-    public void testGeoInfoOnLocation() {
-        app.start( [ WEST_CHILD_WITH_LOCATION, EAST_CHILD_WITH_LOCATION ] );
-        
-        waitForTargetHosts(geoDns);
-        assertTrue(geoDns.targetHostsByName.containsKey("West child with location"), "targets="+geoDns.targetHostsByName);
-        assertTrue(geoDns.targetHostsByName.containsKey("East child with location"), "targets="+geoDns.targetHostsByName);
-    }
-    
-    @Test
-    public void testGeoInfoOnParentLocation() {
-        app.start( [ WEST_CHILD, EAST_CHILD ] );
-        
-        waitForTargetHosts(geoDns);
-        assertTrue(geoDns.targetHostsByName.containsKey("West child"), "targets="+geoDns.targetHostsByName);
-        assertTrue(geoDns.targetHostsByName.containsKey("East child"), "targets="+geoDns.targetHostsByName);
-    }
-    
-    //TODO
-//    @Test
-//    public void testMissingGeoInfo() {
-//    }
-//    
-//    @Test
-//    public void testEmptyGroup() {
-//    }
-    
-    private static void waitForTargetHosts(GeoDnsTestService service) {
-        new Repeater("Wait for target hosts")
-            .repeat()
-            .every(500 * MILLISECONDS)
-            .until { service.targetHostsByName.size() == 2 }
-            .limitIterationsTo(20)
-            .run();
-    }
-    
-    
-    private static class GeoDnsTestService extends AbstractGeoDnsServiceImpl {
-        public Map<String, HostGeoInfo> targetHostsByName = new LinkedHashMap<String, HostGeoInfo>();
-        
-        public GeoDnsTestService(properties=[:], Entity parent) {
-            super(properties, parent);
-        }
-        
-        protected boolean addTargetHost(Entity e, boolean doUpdate) {
-            //ignore geo lookup, override parent menu
-            log.info("TestService adding target host $e");
-            Location l = Iterables.getOnlyElement(e.locations);
-            HostGeoInfo geoInfo = new HostGeoInfo("127.0.0.1", l.name, 
-                l.findLocationProperty("latitude"), l.findLocationProperty("longitude"));
-            targetHosts.put(e, geoInfo);
-            if (doUpdate) update();
-            return true;
-        }
-        
-        @Override
-        protected void reconfigureService(Collection<HostGeoInfo> targetHosts) {
-            targetHostsByName.clear();
-            for (HostGeoInfo host : targetHosts) {
-                if (host != null) targetHostsByName.put(host.displayName, host);
-            }
-        }
-
-        @Override
-        public String getHostname() {
-            return "localhost";
-        }
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8d1b5d2b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.java b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.java
new file mode 100644
index 0000000..b365a6a
--- /dev/null
+++ b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.java
@@ -0,0 +1,166 @@
+package brooklyn.entity.dns;
+
+import static org.testng.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+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.basic.ApplicationBuilder;
+import brooklyn.entity.basic.DynamicGroup;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.group.DynamicFabric;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.location.Location;
+import brooklyn.location.basic.SimulatedLocation;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.location.geo.HostGeoInfo;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.test.entity.TestEntity;
+import brooklyn.util.MutableMap;
+import brooklyn.util.internal.Repeater;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+
+public class AbstractGeoDnsServiceTest {
+    public static final Logger log = LoggerFactory.getLogger(AbstractGeoDnsServiceTest.class);
+
+    private static final String WEST_IP = "208.95.232.123";
+    private static final String EAST_IP = "216.150.144.82";
+    private static final double WEST_LATITUDE = 37.43472, WEST_LONGITUDE = -121.89500;
+    private static final double EAST_LATITUDE = 41.10361, EAST_LONGITUDE = -73.79583;
+    
+    private static SimulatedLocation newSimulatedLocation(String name, double lat, double lon) {
+        return new SimulatedLocation(MutableMap.of("name", name, "latitude", lat, "longitude", lon));
+    }
+    
+    private static Location newSshMachineLocation(String name, String address, Location parent) {
+        return new SshMachineLocation(MutableMap.of("name", name, "address", address, "parentLocation", parent)); 
+    }
+    
+    private static Location newSshMachineLocation(String name, String address, Location parent, double lat, double lon) {
+        return new SshMachineLocation(MutableMap.of("name", name, "address", address, "parentLocation", parent, "latitude", lat, "longitude", lon)); 
+    }
+    
+    private static final Location WEST_PARENT = newSimulatedLocation("West parent", WEST_LATITUDE, WEST_LONGITUDE);
+    
+    private static final Location WEST_CHILD = newSshMachineLocation("West child", WEST_IP, WEST_PARENT);
+    private static final Location WEST_CHILD_WITH_LOCATION = newSshMachineLocation("West child with location", WEST_IP, WEST_PARENT, WEST_LATITUDE, WEST_LONGITUDE); 
+    
+    private static final Location EAST_PARENT = newSimulatedLocation("East parent", EAST_LATITUDE, EAST_LONGITUDE);
+    private static final Location EAST_CHILD = newSshMachineLocation("East child", EAST_IP, EAST_PARENT); 
+    private static final Location EAST_CHILD_WITH_LOCATION = newSshMachineLocation("East child with location", EAST_IP, EAST_PARENT, EAST_LATITUDE, EAST_LONGITUDE); 
+    
+    private TestApplication app;
+    private DynamicFabric fabric;
+    private DynamicGroup testEntities;
+    private GeoDnsTestService geoDns;
+    
+
+    @BeforeMethod(alwaysRun=true)
+    public void setup() {
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        fabric = app.createAndManageChild(EntitySpecs.spec(DynamicFabric.class)
+            .configure(DynamicFabric.MEMBER_SPEC, EntitySpecs.spec(TestEntity.class)));
+        
+        testEntities = app.createAndManageChild(EntitySpecs.spec(DynamicGroup.class)
+            .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class)));
+        geoDns = new GeoDnsTestService(MutableMap.of("pollPeriod", 10), app);
+        geoDns.setTargetEntityProvider(testEntities);
+        Entities.startManagement(geoDns);
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void shutdown() {
+        if (app != null) Entities.destroy(app);
+    }
+
+    
+    @Test
+    public void testGeoInfoOnLocation() {
+        app.start( ImmutableList.of(WEST_CHILD_WITH_LOCATION, EAST_CHILD_WITH_LOCATION) );
+        
+        waitForTargetHosts(geoDns);
+        assertTrue(geoDns.targetHostsByName.containsKey("West child with location"), "targets="+geoDns.targetHostsByName);
+        assertTrue(geoDns.targetHostsByName.containsKey("East child with location"), "targets="+geoDns.targetHostsByName);
+    }
+    
+    @Test
+    public void testGeoInfoOnParentLocation() {
+        app.start( ImmutableList.of(WEST_CHILD, EAST_CHILD) );
+        
+        waitForTargetHosts(geoDns);
+        assertTrue(geoDns.targetHostsByName.containsKey("West child"), "targets="+geoDns.targetHostsByName);
+        assertTrue(geoDns.targetHostsByName.containsKey("East child"), "targets="+geoDns.targetHostsByName);
+    }
+    
+    //TODO
+//    @Test
+//    public void testMissingGeoInfo() {
+//    }
+//    
+//    @Test
+//    public void testEmptyGroup() {
+//    }
+    
+    private static void waitForTargetHosts(final GeoDnsTestService service) {
+        new Repeater("Wait for target hosts")
+            .repeat()
+            .every(500, TimeUnit.MILLISECONDS)
+            .until(new Callable<Boolean>() {
+                public Boolean call() {
+                    return service.targetHostsByName.size() == 2;
+                }})
+            .limitIterationsTo(20)
+            .run();
+    }
+    
+    
+    private static class GeoDnsTestService extends AbstractGeoDnsServiceImpl {
+        public Map<String, HostGeoInfo> targetHostsByName = new LinkedHashMap<String, HostGeoInfo>();
+
+        public GeoDnsTestService(Entity parent) {
+            super(MutableMap.of(), parent);
+        }
+
+        public GeoDnsTestService(Map properties, Entity parent) {
+            super(properties, parent);
+        }
+        
+        @Override
+        protected boolean addTargetHost(Entity e) {
+            //ignore geo lookup, override parent menu
+            log.info("TestService adding target host $e");
+            Location l = Iterables.getOnlyElement(e.getLocations());
+            HostGeoInfo geoInfo = new HostGeoInfo("127.0.0.1", l.getName(), 
+                (Double) l.findLocationProperty("latitude"), (Double) l.findLocationProperty("longitude"));
+            targetHosts.put(e, geoInfo);
+            return true;
+        }
+        
+        @Override
+        protected void reconfigureService(Collection<HostGeoInfo> targetHosts) {
+            targetHostsByName.clear();
+            for (HostGeoInfo host : targetHosts) {
+                if (host != null) targetHostsByName.put(host.displayName, host);
+            }
+        }
+
+        @Override
+        public String getHostname() {
+            return "localhost";
+        }
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8d1b5d2b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
deleted file mode 100644
index bae975f..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
+++ /dev/null
@@ -1,67 +0,0 @@
-package brooklyn.entity.dns.geoscaling
-
-import static java.util.concurrent.TimeUnit.*
-import static org.testng.Assert.*
-
-import org.testng.annotations.Test
-
-import brooklyn.entity.basic.ApplicationBuilder
-import brooklyn.entity.basic.Attributes
-import brooklyn.entity.basic.DynamicGroup
-import brooklyn.entity.proxying.EntitySpecs
-import brooklyn.location.basic.SshMachineLocation
-import brooklyn.location.geo.HostGeoInfo
-import brooklyn.test.entity.TestApplication
-import brooklyn.test.entity.TestEntity
-import brooklyn.util.internal.Repeater
-import brooklyn.util.internal.TimeExtras
-
-import com.google.common.base.Predicates
-
-/**
- * {@link GeoscalingScriptGenerator} unit tests.
- */
-class GeoscalingIntegrationTest {
-    static { TimeExtras.init() }
-
-    private final static Set<HostGeoInfo> HOSTS = [
-        new HostGeoInfo("1.2.3.100", "Server 1", 40.0, -80.0),
-        new HostGeoInfo("1.2.3.101", "Server 2", 30.0, 20.0)
-    ]
-
-    private final String primaryDomain = "geopaas.org"//"domain"+((int)(Math.random()*10000))+".test.org";
-    private final String subDomain = "subdomain"+((int)(Math.random()*10000));
-    private final InetAddress addr = InetAddress.localHost
-    private final SshMachineLocation loc = new SshMachineLocation(address:addr, name:'Edinburgh', latitude : 55.94944, longitude : -3.16028, iso3166 : ["GB-EDH"])
-    
-    @Test(groups=["Integration"])
-    public void testRoutesToExpectedLocation() {
-        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        TestEntity target = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
-        target.setAttribute(Attributes.HOSTNAME,addr.getHostName())
-        
-        DynamicGroup group = app.createAndManageChild(EntitySpecs.spec(DynamicGroup.class)
-                .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class)));
-        
-        GeoscalingDnsService geoDns = app.createAndManageChild(EntitySpecs.spec(GeoscalingDnsService.class)
-                .displayName("Geo-DNS")
-                .configure("username", "cloudsoft")
-                .configure("password", "cl0uds0ft")
-                .configure("primaryDomainName", primaryDomain)
-                .configure("smartSubdomainName", subDomain)
-                .configure("targetEntityProvider", group));
-        
-        app.start([loc])
-        
-        println("geo-scaling test, using $subDomain.$primaryDomain; expect to be wired to $addr")
-        
-        new Repeater("Wait for target hosts")
-            .repeat()
-            .every(500 * MILLISECONDS)
-            .until { geoDns.getTargetHosts().size() == 1 }
-            .limitIterationsTo(20)
-            .run();
-        
-        assertEquals(geoDns.getTargetHosts().size(), 1);
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8d1b5d2b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.java
new file mode 100644
index 0000000..bfae0b5
--- /dev/null
+++ b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.java
@@ -0,0 +1,86 @@
+package brooklyn.entity.dns.geoscaling;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.InetAddress;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Attributes;
+import brooklyn.entity.basic.DynamicGroup;
+import brooklyn.entity.proxying.EntitySpecs;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.location.geo.HostGeoInfo;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.test.entity.TestEntity;
+import brooklyn.util.MutableMap;
+import brooklyn.util.NetworkUtils;
+import brooklyn.util.internal.Repeater;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * {@link GeoscalingScriptGenerator} unit tests.
+ */
+public class GeoscalingIntegrationTest {
+
+    protected static final Logger LOG = LoggerFactory.getLogger(GeoscalingIntegrationTest.class);
+
+    private final static Set<HostGeoInfo> HOSTS = ImmutableSet.of(
+        new HostGeoInfo("1.2.3.100", "Server 1", 40.0, -80.0),
+        new HostGeoInfo("1.2.3.101", "Server 2", 30.0, 20.0)
+    );
+
+    private final String primaryDomain = "geopaas.org";//"domain"+((int)(Math.random()*10000))+".test.org";
+    private final String subDomain = "subdomain"+((int)(Math.random()*10000));
+    private final InetAddress addr = NetworkUtils.getLocalHost();
+    private final SshMachineLocation loc = new SshMachineLocation(MutableMap.builder()
+            .put("address", addr)
+            .put("name", "Edinburgh")
+            .put("latitude", 55.94944)
+            .put("longitude", -3.16028)
+            .put("iso3166", ImmutableList.of("GB-EDH"))
+            .build());
+    
+    @Test(groups={"Integration"})
+    public void testRoutesToExpectedLocation() {
+        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        TestEntity target = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
+        target.setAttribute(Attributes.HOSTNAME,addr.getHostName());
+        
+        DynamicGroup group = app.createAndManageChild(EntitySpecs.spec(DynamicGroup.class)
+                .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class)));
+        
+        final GeoscalingDnsService geoDns = app.createAndManageChild(EntitySpecs.spec(GeoscalingDnsService.class)
+                .displayName("Geo-DNS")
+                .configure("username", "cloudsoft")
+                .configure("password", "cl0uds0ft")
+                .configure("primaryDomainName", primaryDomain)
+                .configure("smartSubdomainName", subDomain)
+                .configure("targetEntityProvider", group));
+        
+        app.start(ImmutableList.of(loc));
+        
+        LOG.info("geo-scaling test, using {}.{}; expect to be wired to {}", new Object[] {subDomain, primaryDomain, addr});
+        
+        new Repeater("Wait for target hosts")
+            .repeat()
+            .every(500, TimeUnit.MILLISECONDS)
+            .until(new Callable<Boolean>() {
+                public Boolean call() {
+                    return geoDns.getTargetHosts().size() == 1;
+                }})
+            .limitIterationsTo(20)
+            .run();
+        
+        assertEquals(geoDns.getTargetHosts().size(), 1);
+    }
+}


[29/50] brooklyn-library git commit: Tidy up interface definitions

Posted by he...@apache.org.
Tidy up interface definitions


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/98257804
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/98257804
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/98257804

Branch: refs/heads/0.5.0
Commit: 982578042e025181b2af67a215917229c1ab3bc3
Parents: 9cbbe5e
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Mar 21 12:09:30 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/messaging/kafka/Kafka.java  |  3 +-
 .../entity/messaging/kafka/KafkaBroker.java     | 25 +++++++-------
 .../entity/messaging/kafka/KafkaCluster.java    | 36 ++++++++++----------
 .../entity/messaging/kafka/KafkaZookeeper.java  | 14 ++++----
 4 files changed, 41 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/98257804/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
index a0e4eef..02cc0af 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
@@ -15,6 +15,7 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
@@ -26,7 +27,7 @@ import brooklyn.util.flags.SetFromFlag;
  */
 public interface Kafka {
 
-    BasicConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "0.7.2-incubating");
+    ConfigKey<String> SUGGESTED_VERSION = new BasicConfigKey<String>(SoftwareProcess.SUGGESTED_VERSION, "0.7.2-incubating");
 
     @SetFromFlag("downloadUrl")
     BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/98257804/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
index e17f0de..2a82b13 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -15,6 +15,7 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.messaging.MessageBroker;
@@ -35,31 +36,31 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
     public static final ConfigKey<Integer> START_TIMEOUT = SoftwareProcess.START_TIMEOUT;
 
     @SetFromFlag("version")
-    BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
+    ConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
 
     @SetFromFlag("kafkaPort")
     PortAttributeSensorAndConfigKey KAFKA_PORT = new PortAttributeSensorAndConfigKey("kafka.port", "Kafka port", "9092+");
 
     /** Location of the configuration file template to be copied to the server.*/
     @SetFromFlag("serverConfig")
-    BasicConfigKey<String> SERVER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
-            String.class, "kafka.config.server", "Server configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/server.properties");
+    ConfigKey<String> SERVER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
+            String.class, "kafka.broker.configTemplate", "Server configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/server.properties");
 
     @SetFromFlag("zookeeper")
-    BasicConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "kafka.broker.zookeeper", "Kafka zookeeper entity");
+    ConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "kafka.broker.zookeeper", "Kafka zookeeper entity");
 
     AttributeSensor<Integer> BROKER_ID = new BasicAttributeSensor<Integer>(Integer.class, "kafka.broker.id", "Kafka unique broker ID");
 
-    BasicAttributeSensor<Long> FETCH_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.total", "Fetch request count");
-    BasicAttributeSensor<Long> TOTAL_FETCH_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.time.total", "Total fetch request processing time (millis)");
-    BasicAttributeSensor<Double> MAX_FETCH_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.fetch.time.max", "Max fetch request processing time (millis)");
+    AttributeSensor<Long> FETCH_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.total", "Fetch request count");
+    AttributeSensor<Long> TOTAL_FETCH_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.fetch.time.total", "Total fetch request processing time (millis)");
+    AttributeSensor<Double> MAX_FETCH_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.fetch.time.max", "Max fetch request processing time (millis)");
 
-    BasicAttributeSensor<Long> PRODUCE_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.total", "Produce request count");
-    BasicAttributeSensor<Long> TOTAL_PRODUCE_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.time.total", "Total produce request processing time (millis)");
-    BasicAttributeSensor<Double> MAX_PRODUCE_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.produce.time.max", "Max produce request processing time (millis)");
+    AttributeSensor<Long> PRODUCE_REQUEST_COUNT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.total", "Produce request count");
+    AttributeSensor<Long> TOTAL_PRODUCE_TIME = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.produce.time.total", "Total produce request processing time (millis)");
+    AttributeSensor<Double> MAX_PRODUCE_TIME = new BasicAttributeSensor<Double>(Double.class, "kafka.broker.produce.time.max", "Max produce request processing time (millis)");
 
-    BasicAttributeSensor<Long> BYTES_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.received", "Total bytes received");
-    BasicAttributeSensor<Long> BYTES_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.sent", "Total bytes sent");
+    AttributeSensor<Long> BYTES_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.received", "Total bytes received");
+    AttributeSensor<Long> BYTES_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.broker.bytes.sent", "Total bytes sent");
 
     Integer getKafkaPort();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/98257804/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
index 65ed272..96e46ff 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaCluster.java
@@ -53,7 +53,7 @@ import brooklyn.util.flags.SetFromFlag;
 @ImplementedBy(KafkaClusterImpl.class)
 public interface KafkaCluster extends Entity, Startable, Resizable  {
 
-    public static class Spec<T extends KafkaCluster, S extends Spec<T,S>> extends BasicEntitySpec<T,S> {
+    class Spec<T extends KafkaCluster, S extends Spec<T,S>> extends BasicEntitySpec<T,S> {
 
         private static class ConcreteSpec extends Spec<KafkaCluster, ConcreteSpec> {
             ConcreteSpec() {
@@ -70,7 +70,7 @@ public interface KafkaCluster extends Entity, Startable, Resizable  {
         }
 
         public S initialSize(int val) {
-            configure(INITIAL_SIZE, 1);
+            configure(INITIAL_SIZE, val);
             return self();
         }
 
@@ -94,35 +94,35 @@ public interface KafkaCluster extends Entity, Startable, Resizable  {
     public static final ConfigKey<Integer> START_TIMEOUT = ConfigKeys.START_TIMEOUT;
 
     @SetFromFlag("initialSize")
-    public static ConfigKey<Integer> INITIAL_SIZE = new BasicConfigKey<Integer>(Cluster.INITIAL_SIZE, 1);
+    ConfigKey<Integer> INITIAL_SIZE = new BasicConfigKey<Integer>(Cluster.INITIAL_SIZE, 1);
 
-    @SetFromFlag("controller")
-    public static BasicAttributeSensorAndConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicAttributeSensorAndConfigKey<KafkaZookeeper>(
-            KafkaZookeeper.class, "kafkacluster.zookeeper", "Kafka zookeeper for the cluster; if null a default will created");
+    @SetFromFlag("zookeeper")
+    BasicAttributeSensorAndConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicAttributeSensorAndConfigKey<KafkaZookeeper>(
+            KafkaZookeeper.class, "kafka.cluster.zookeeper", "Kafka zookeeper for the cluster; if null a default will created");
 
     @SetFromFlag("zookeeperSpec")
-    public static BasicAttributeSensorAndConfigKey<EntitySpec<KafkaZookeeper>> ZOOKEEPER_SPEC = new BasicAttributeSensorAndConfigKey(
-            EntitySpec.class, "kafkacluster.zookeeperSpec", "Spec for creating the kafka zookeeper");
+    BasicAttributeSensorAndConfigKey<EntitySpec<KafkaZookeeper>> ZOOKEEPER_SPEC = new BasicAttributeSensorAndConfigKey(
+            EntitySpec.class, "kafka.cluster.zookeeperSpec", "Spec for creating the kafka zookeeper");
 
     /** Factory to create a Kafka broker, given flags */
     @SetFromFlag("brokerFactory")
-    public static BasicAttributeSensorAndConfigKey<ConfigurableEntityFactory<KafkaBroker>> BROKER_FACTORY = new BasicAttributeSensorAndConfigKey(
-            ConfigurableEntityFactory.class, "kafkacluster.brokerFactory", "Factory to create a Kafka broker");
+    BasicAttributeSensorAndConfigKey<ConfigurableEntityFactory<KafkaBroker>> BROKER_FACTORY = new BasicAttributeSensorAndConfigKey(
+            ConfigurableEntityFactory.class, "kafka.cluster.brokerFactory", "Factory to create a Kafka broker");
 
     /** Spec for Kafka broker entiites to be created */
     @SetFromFlag("brokerSpec")
-    public static BasicAttributeSensorAndConfigKey<EntitySpec<KafkaBroker>> BROKER_SPEC = new BasicAttributeSensorAndConfigKey(
-            EntitySpec.class, "kafkacluster.brokerSpec", "Spec for Kafka broker entiites to be created");
+    BasicAttributeSensorAndConfigKey<EntitySpec<KafkaBroker>> BROKER_SPEC = new BasicAttributeSensorAndConfigKey(
+            EntitySpec.class, "kafka.cluster.brokerSpec", "Spec for Kafka broker entiites to be created");
 
-    public static AttributeSensor<DynamicCluster> CLUSTER = new BasicAttributeSensor<DynamicCluster>(
-            DynamicCluster.class, "kafkacluster.cluster", "Underlying Kafka broker cluster");
+    AttributeSensor<DynamicCluster> CLUSTER = new BasicAttributeSensor<DynamicCluster>(
+            DynamicCluster.class, "kafka.cluster.brokerCluster", "Underlying Kafka broker cluster");
 
-    public static final AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME;
+    AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME;
 
-    public KafkaZookeeper getZookeeper();
+    KafkaZookeeper getZookeeper();
 
-    public ConfigurableEntityFactory<KafkaBroker> getBrokerFactory();
+    ConfigurableEntityFactory<KafkaBroker> getBrokerFactory();
 
-    public DynamicCluster getCluster();
+    DynamicCluster getCluster();
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/98257804/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
index 522828f..a001a29 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeper.java
@@ -15,9 +15,11 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import brooklyn.config.ConfigKey;
 import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.entity.java.UsesJmx;
 import brooklyn.entity.proxying.ImplementedBy;
+import brooklyn.event.AttributeSensor;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
@@ -33,19 +35,19 @@ public interface KafkaZookeeper extends SoftwareProcess, UsesJmx, Kafka {
     public static final ConfigKey<Integer> START_TIMEOUT = SoftwareProcess.START_TIMEOUT;
 
     @SetFromFlag("version")
-    BasicConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
+    ConfigKey<String> SUGGESTED_VERSION = Kafka.SUGGESTED_VERSION;
 
     @SetFromFlag("zookeeperPort")
     PortAttributeSensorAndConfigKey ZOOKEEPER_PORT = new PortAttributeSensorAndConfigKey("zookeeper.port", "Zookeeper port", "2181+");
 
     /** Location of the configuration file template to be copied to the server. */
     @SetFromFlag("zookeeperConfig")
-    BasicConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
-            String.class, "kafka.config.zookeeper", "Zookeeper configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");
+    ConfigKey<String> ZOOKEEPER_CONFIG_TEMPLATE = new BasicConfigKey<String>(
+            String.class, "kafka.zookeeper.configTemplate", "Zookeeper configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/zookeeper.properties");
 
-    BasicAttributeSensor<Long> OUTSTANDING_REQUESTS = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.outstandingRequests", "Outstanding request count");
-    BasicAttributeSensor<Long> PACKETS_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.received", "Total packets received");
-    BasicAttributeSensor<Long> PACKETS_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.sent", "Total packets sent");
+    AttributeSensor<Long> OUTSTANDING_REQUESTS = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.outstandingRequests", "Outstanding request count");
+    AttributeSensor<Long> PACKETS_RECEIVED = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.received", "Total packets received");
+    AttributeSensor<Long> PACKETS_SENT = new BasicAttributeSensor<Long>(Long.class, "kafka.zookeeper.packets.sent", "Total packets sent");
 
     Integer getZookeeperPort();
 


[09/50] brooklyn-library git commit: KarafSshDriver: expandedInstallDir is protected

Posted by he...@apache.org.
KarafSshDriver: expandedInstallDir is protected

- Needs to be protected for sub-types that override install()
- TODO: Should this be protected (rather than private) in all
  our entity driver? Probably!


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/bccb14fb
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/bccb14fb
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/bccb14fb

Branch: refs/heads/0.5.0
Commit: bccb14fb25f409a0526172c4db1d31fb24acc270
Parents: 23a5c98
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 15:23:55 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Mar 29 09:37:57 2013 +0000

----------------------------------------------------------------------
 .../src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/bccb14fb/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
----------------------------------------------------------------------
diff --git a/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java b/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
index 787717a..ccd713a 100644
--- a/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
+++ b/software/osgi/src/main/java/brooklyn/entity/osgi/karaf/KarafSshDriver.java
@@ -17,7 +17,7 @@ import com.google.common.collect.ImmutableList;
 
 public class KarafSshDriver extends JavaSoftwareProcessSshDriver implements KarafDriver {
 
-    private String expandedInstallDir;
+    protected String expandedInstallDir;
 
     // TODO getJmxJavaSystemProperties(), don't set via JAVA_OPTS; set ourselves manually
     // (karaf reads from props files)
@@ -37,7 +37,7 @@ public class KarafSshDriver extends JavaSoftwareProcessSshDriver implements Kara
         return format("{%s}/data/karaf.out", getRunDir());
     }
 
-    private String getExpandedInstallDir() {
+    protected String getExpandedInstallDir() {
         if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
         return expandedInstallDir;
     }


[13/50] brooklyn-library git commit: Examples extend AbstractApplication instead of ApplicationBuilder

Posted by he...@apache.org.
Examples extend AbstractApplication instead of ApplicationBuilder


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/3c0f5e60
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/3c0f5e60
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/3c0f5e60

Branch: refs/heads/0.5.0
Commit: 3c0f5e60b45be72d0afc2acebc3e9111b73a4cd0
Parents: 576b649
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 16:45:00 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Apr 1 12:41:41 2013 +0100

----------------------------------------------------------------------
 .../java/brooklyn/demo/GlobalWebFabricExample.java     | 11 ++++++-----
 .../extras/whirr/WebClusterWithHadoopExample.java      |  2 +-
 .../extras/whirr/WebFabricWithHadoopExample.java       |  2 +-
 .../main/java/brooklyn/extras/whirr/WhirrExample.java  |  9 +++++----
 .../java/brooklyn/extras/whirr/WhirrHadoopExample.java |  8 ++++----
 .../demo/MonitoredCassandraClusterExample.java         |  6 +++---
 .../MovableCloudFoundryClusterExample.java             |  8 ++++----
 .../java/brooklyn/demo/StandaloneBrokerExample.java    |  9 +++++----
 .../java/brooklyn/demo/SingleWebServerExample.java     |  8 ++++----
 .../java/brooklyn/demo/WebClusterDatabaseExample.java  | 13 +++++++------
 .../demo/WebClusterDatabaseExampleGroovy.groovy        | 11 ++++++-----
 .../src/main/java/brooklyn/demo/WebClusterExample.java |  9 +++++----
 12 files changed, 51 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
----------------------------------------------------------------------
diff --git a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
index d57d9e3..dbfab17 100644
--- a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
+++ b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
@@ -9,7 +9,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.config.StringConfigMap;
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.dns.geoscaling.GeoscalingDnsService;
@@ -27,7 +27,7 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-public class GlobalWebFabricExample extends ApplicationBuilder {
+public class GlobalWebFabricExample extends AbstractApplication {
 
     public static final Logger log = LoggerFactory.getLogger(GlobalWebFabricExample.class);
     
@@ -39,8 +39,9 @@ public class GlobalWebFabricExample extends ApplicationBuilder {
             "aws-ec2:us-west-1" 
 //            "cloudfoundry:https://api.aws.af.cm/",
         );
-    
-    protected void doBuild() {
+
+    @Override
+    public void postConstruct() {
         StringConfigMap config = getManagementContext().getConfig();
         
         GeoscalingDnsService geoDns = addChild(EntitySpecs.spec(GeoscalingDnsService.class)
@@ -74,7 +75,7 @@ public class GlobalWebFabricExample extends ApplicationBuilder {
         String locations = CommandLineUtil.getCommandLineOption(args, "--locations", Joiner.on(",").join(DEFAULT_LOCATIONS));
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new GlobalWebFabricExample().appDisplayName("Brooklyn Global Web Fabric Example"))
+                .application(EntitySpecs.appSpec(GlobalWebFabricExample.class).displayName("Brooklyn Global Web Fabric Example"))
                 .webconsolePort(port)
                 .locations(Arrays.asList(locations))
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
index 683938d..0a0f849 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebClusterWithHadoopExample.java
@@ -182,7 +182,7 @@ public class WebClusterWithHadoopExample extends AbstractApplication implements
         String location = CommandLineUtil.getCommandLineOption(args, "--location", Joiner.on(",").join(DEFAULT_LOCATIONS));
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(EntitySpecs.spec(StartableApplication.class)
+                .application(EntitySpecs.appSpec(StartableApplication.class)
                         .displayName("Brooklyn Global Web Fabric with Hadoop Example")
                         .impl(WebClusterWithHadoopExample.class))
                 .webconsolePort(port)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
index d53b798..11916a1 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
@@ -256,7 +256,7 @@ public class WebFabricWithHadoopExample extends AbstractApplication implements S
         String location = CommandLineUtil.getCommandLineOption(args, "--location", Joiner.on(",").join(DEFAULT_LOCATIONS));
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(EntitySpecs.spec(StartableApplication.class)
+                .application(EntitySpecs.appSpec(StartableApplication.class)
                         .displayName("Brooklyn Global Web Fabric with Hadoop Example")
                         .impl(WebFabricWithHadoopExample.class))
                 .webconsolePort(port)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
index a3fe74c..d01bc4c 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrExample.java
@@ -5,7 +5,7 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.StartableApplication;
 import brooklyn.entity.proxying.EntitySpecs;
@@ -15,7 +15,7 @@ import brooklyn.util.CommandLineUtil;
 
 import com.google.common.collect.Lists;
 
-public class WhirrExample extends ApplicationBuilder {
+public class WhirrExample extends AbstractApplication {
 
     private static final Logger LOG = LoggerFactory.getLogger(WhirrExample.class);
 
@@ -26,7 +26,8 @@ public class WhirrExample extends ApplicationBuilder {
             "whirr.hardware-min-ram=1024"+"\n"+
             "whirr.instance-templates=1 noop, 1 elasticsearch"+"\n";
 
-    protected void doBuild() {
+    @Override
+    public void postConstruct() {
         WhirrCluster cluster = addChild(EntitySpecs.spec(WhirrCluster.class)
                 .configure("recipe", RECIPE));
     }
@@ -37,7 +38,7 @@ public class WhirrExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new WhirrExample())
+                .application(EntitySpecs.appSpec(WhirrExample.class))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
index fbaa636..7a51b0c 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WhirrHadoopExample.java
@@ -5,7 +5,7 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.StartableApplication;
 import brooklyn.entity.proxying.EntitySpecs;
@@ -16,14 +16,14 @@ import brooklyn.util.CommandLineUtil;
 
 import com.google.common.collect.Lists;
 
-public class WhirrHadoopExample extends ApplicationBuilder {
+public class WhirrHadoopExample extends AbstractApplication {
 
     private static final Logger LOG = LoggerFactory.getLogger(WhirrHadoopExample.class);
 
     public static final String DEFAULT_LOCATION = "aws-ec2:eu-west-1";
 
     @Override
-    protected void doBuild() {
+    public void postConstruct() {
         WhirrCluster cluster = addChild(EntitySpecs.spec(WhirrHadoopCluster.class)
                 .displayName("brooklyn-hadoop-example")
                 .configure("size", 2)
@@ -36,7 +36,7 @@ public class WhirrHadoopExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new WhirrHadoopExample())
+                .application(EntitySpecs.appSpec(WhirrHadoopExample.class))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
index 3c1a05f..6c475b2 100644
--- a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
+++ b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
@@ -1,14 +1,14 @@
 package brooklyn.demo;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.nosql.cassandra.CassandraCluster;
 import brooklyn.entity.proxying.EntitySpecs;
 
 /** Cassandra Application */
-public class MonitoredCassandraClusterExample extends ApplicationBuilder {
+public class MonitoredCassandraClusterExample extends AbstractApplication {
 
     @Override
-    protected void doBuild() {
+    public void postConstruct() {
         addChild(EntitySpecs.spec(CassandraCluster.class)
                 .configure("initialSize", "2")
                 .configure("clusterName", "CassandraDemo")

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
index 4b6dbb1..ee96826 100644
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
+++ b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
@@ -2,7 +2,7 @@ package brooklyn.example.cloudfoundry;
 
 import java.util.List;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.launcher.BrooklynLauncher;
@@ -10,13 +10,13 @@ import brooklyn.util.CommandLineUtil;
 
 import com.google.common.collect.Lists;
 
-public class MovableCloudFoundryClusterExample extends ApplicationBuilder {
+public class MovableCloudFoundryClusterExample extends AbstractApplication {
 
     public static final String DEFAULT_LOCATION = "cloudfoundry";
     public static final String WAR_FILE_URL = "classpath://hello-world-webapp.war";
 
     @Override
-    protected void doBuild() {
+    public void postConstruct() {
         addChild(EntitySpecs.spec(MovableElasticWebAppCluster.class)
                 .configure("war", WAR_FILE_URL));
     }
@@ -27,7 +27,7 @@ public class MovableCloudFoundryClusterExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new MovableCloudFoundryClusterExample().appDisplayName("Movable Web Cluster"))
+                .application(EntitySpecs.appSpec(MovableCloudFoundryClusterExample.class).displayName("Movable Web Cluster"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
index 014e3c8..3d9b903 100644
--- a/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
+++ b/examples/simple-messaging-pubsub/src/main/java/brooklyn/demo/StandaloneBrokerExample.java
@@ -2,7 +2,7 @@ package brooklyn.demo;
 
 import java.util.List;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.messaging.amqp.AmqpServer;
 import brooklyn.entity.messaging.qpid.QpidBroker;
@@ -14,7 +14,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
 /** Qpid Broker Application */
-public class StandaloneBrokerExample extends ApplicationBuilder {
+public class StandaloneBrokerExample extends AbstractApplication {
 
     public static final String CUSTOM_CONFIG_PATH = "classpath://custom-config.xml";
     public static final String PASSWD_PATH = "classpath://passwd";
@@ -23,7 +23,8 @@ public class StandaloneBrokerExample extends ApplicationBuilder {
 
     public static final String DEFAULT_LOCATION = "localhost";
     
-    protected void doBuild() {
+    @Override
+    public void postConstruct() {
         // Configure the Qpid broker entity
     	QpidBroker broker = addChild(EntitySpecs.spec(QpidBroker.class)
     	        .configure("amqpPort", 5672)
@@ -43,7 +44,7 @@ public class StandaloneBrokerExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new StandaloneBrokerExample().appDisplayName("Qpid app"))
+                .application(EntitySpecs.appSpec(StandaloneBrokerExample.class).displayName("Qpid app"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
index 2290497..10905e1 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/SingleWebServerExample.java
@@ -5,7 +5,7 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.entity.webapp.jboss.JBoss7Server;
@@ -15,14 +15,14 @@ import brooklyn.util.CommandLineUtil;
 import com.google.common.collect.Lists;
 
 /** This example starts one web app on 8080, waits for a keypress, then stops it. */
-public class SingleWebServerExample extends ApplicationBuilder {
+public class SingleWebServerExample extends AbstractApplication {
 
     public static final Logger LOG = LoggerFactory.getLogger(SingleWebServerExample.class);
 
     private static final String WAR_PATH = "classpath://hello-world-webapp.war";
 
     @Override
-    protected void doBuild() {
+    public void postConstruct() {
         addChild(EntitySpecs.spec(JBoss7Server.class)
                 .configure("war", WAR_PATH)
                 .configure("httpPort", "8080+"));
@@ -35,7 +35,7 @@ public class SingleWebServerExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", "localhost");
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new SingleWebServerExample().appDisplayName("Brooklyn WebApp Cluster with Database example"))
+                .application(EntitySpecs.appSpec(SingleWebServerExample.class).displayName("Brooklyn WebApp Cluster with Database example"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
index fb9b9f6..5436ee6 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExample.java
@@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.enricher.basic.SensorPropagatingEnricher;
 import brooklyn.enricher.basic.SensorTransformingEnricher;
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.database.mysql.MySqlNode;
 import brooklyn.entity.proxying.EntitySpecs;
@@ -32,7 +32,7 @@ import com.google.common.collect.Lists;
 /**
  * Launches a 3-tier app with nginx, clustered jboss, and mysql.
  **/
-public class WebClusterDatabaseExample extends ApplicationBuilder {
+public class WebClusterDatabaseExample extends AbstractApplication {
     
     public static final Logger LOG = LoggerFactory.getLogger(WebClusterDatabaseExample.class);
     
@@ -47,7 +47,8 @@ public class WebClusterDatabaseExample extends ApplicationBuilder {
     public static final BasicAttributeSensor<Integer> APPSERVERS_COUNT = new BasicAttributeSensor<Integer>(Integer.class, 
             "appservers.count", "Number of app servers deployed");
 
-    protected void doBuild() {
+    @Override
+    public void postConstruct() {
         MySqlNode mysql = addChild(EntitySpecs.spec(MySqlNode.class)
                 .configure("creationScriptUrl", DB_SETUP_SQL_URL));
         
@@ -67,10 +68,10 @@ public class WebClusterDatabaseExample extends ApplicationBuilder {
                 build());
 
         // expose some KPI's
-        getApp().addEnricher(SensorPropagatingEnricher.newInstanceListeningTo(web,  
+        addEnricher(SensorPropagatingEnricher.newInstanceListeningTo(web,  
                 WebAppServiceConstants.ROOT_URL,
                 DynamicWebAppCluster.REQUESTS_PER_SECOND_IN_WINDOW));
-        getApp().addEnricher(new SensorTransformingEnricher<Integer,Integer>(web, 
+        addEnricher(new SensorTransformingEnricher<Integer,Integer>(web, 
                 DynamicWebAppCluster.GROUP_SIZE, APPSERVERS_COUNT, Functions.<Integer>identity()));
     }
 
@@ -80,7 +81,7 @@ public class WebClusterDatabaseExample extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", "localhost");
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new WebClusterDatabaseExample().appDisplayName("Brooklyn WebApp Cluster with Database example"))
+                .application(EntitySpecs.appSpec(WebClusterDatabaseExample.class).displayName("Brooklyn WebApp Cluster with Database example"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
index 5aa0d3c..ee2652c 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleGroovy.groovy
@@ -7,10 +7,10 @@ import static brooklyn.event.basic.DependentConfiguration.formatString
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
-import brooklyn.entity.basic.ApplicationBuilder
+import brooklyn.entity.basic.AbstractApplication
 import brooklyn.entity.basic.Entities
-import brooklyn.entity.basic.StartableApplication
 import brooklyn.entity.database.mysql.MySqlNode
+import brooklyn.entity.proxying.EntitySpecs
 import brooklyn.entity.webapp.ControlledDynamicWebAppCluster
 import brooklyn.entity.webapp.DynamicWebAppCluster
 import brooklyn.launcher.BrooklynLauncher
@@ -24,7 +24,7 @@ import com.google.common.collect.Lists
  * <p>
  * This variant of {@link WebClusterDatabaseExample} demonstrates <i>Groovy</i> language conveniences.
  **/
-public class WebClusterDatabaseExampleGroovy extends ApplicationBuilder {
+public class WebClusterDatabaseExampleGroovy extends AbstractApplication {
     
     public static final Logger LOG = LoggerFactory.getLogger(WebClusterDatabaseExampleGroovy.class);
     
@@ -38,7 +38,8 @@ public class WebClusterDatabaseExampleGroovy extends ApplicationBuilder {
     public static final String DB_USERNAME = "brooklyn";
     public static final String DB_PASSWORD = "br00k11n";
     
-    protected void doBuild() {
+    @Override
+    public void postConstruct() {
         MySqlNode mysql = addChild(MySqlNode,
                 creationScriptUrl: DB_SETUP_SQL_URL);
         
@@ -63,7 +64,7 @@ public class WebClusterDatabaseExampleGroovy extends ApplicationBuilder {
         String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
 
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new WebClusterDatabaseExampleGroovy().appDisplayName("Brooklyn WebApp Cluster with Database example"))
+                .application(EntitySpecs.appSpec(WebClusterDatabaseExampleGroovy.class).displayName("Brooklyn WebApp Cluster with Database example"))
                 .webconsolePort(port)
                 .location(location)
                 .start();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/3c0f5e60/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
index 97cb4e9..8e6f670 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterExample.java
@@ -6,7 +6,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.config.BrooklynProperties;
-import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxy.nginx.NginxController;
 import brooklyn.entity.proxying.EntitySpecs;
@@ -28,7 +28,7 @@ import com.google.common.collect.Lists;
  * -Xmx512m -Xms128m -XX:MaxPermSize=256m
  * and brooklyn-all jar, and this jar or classes dir, on classpath. 
  **/
-public class WebClusterExample extends ApplicationBuilder {
+public class WebClusterExample extends AbstractApplication {
     public static final Logger LOG = LoggerFactory.getLogger(WebClusterExample.class);
     
     static BrooklynProperties config = BrooklynProperties.Factory.newDefault();
@@ -40,7 +40,8 @@ public class WebClusterExample extends ApplicationBuilder {
     private NginxController nginxController;
     private ControlledDynamicWebAppCluster web;
     
-    protected void doBuild() {
+    @Override
+    public void postConstruct() {
         nginxController = addChild(EntitySpecs.spec(NginxController.class)
                 //.configure("domain", "webclusterexample.brooklyn.local")
                 .configure("port", "8000+"));
@@ -67,7 +68,7 @@ public class WebClusterExample extends ApplicationBuilder {
 
         // TODO Want to parse, to handle multiple locations
         BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(new WebClusterExample().appDisplayName("Brooklyn WebApp Cluster example"))
+                .application(EntitySpecs.appSpec(WebClusterExample.class).displayName("Brooklyn WebApp Cluster example"))
                 .webconsolePort(port)
                 .location(location)
                 .start();


[50/50] brooklyn-library git commit: Changed version to 0.5.0

Posted by he...@apache.org.
Changed version to 0.5.0


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/0e094fa8
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/0e094fa8
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/0e094fa8

Branch: refs/heads/0.5.0
Commit: 0e094fa8beea9073d177cb992212a2c04dc06375
Parents: 929ee88
Author: David Toy <d...@vidtoy.co.uk>
Authored: Wed May 8 19:39:51 2013 +0100
Committer: David Toy <d...@vidtoy.co.uk>
Committed: Wed May 8 19:39:51 2013 +0100

----------------------------------------------------------------------
 examples/global-web-fabric/pom.xml              | 2 +-
 examples/hadoop-and-whirr/pom.xml               | 2 +-
 examples/pom.xml                                | 2 +-
 examples/simple-messaging-pubsub/pom.xml        | 2 +-
 examples/simple-nosql-cluster/pom.xml           | 2 +-
 examples/simple-open-loop-policy/pom.xml        | 2 +-
 examples/simple-web-cluster/pom.xml             | 2 +-
 examples/webapps/hello-world-hadoop-jar/pom.xml | 2 +-
 examples/webapps/hello-world-hadoop/pom.xml     | 2 +-
 examples/webapps/hello-world-sql/pom.xml        | 2 +-
 examples/webapps/hello-world-webapp/pom.xml     | 2 +-
 examples/webapps/pom.xml                        | 2 +-
 sandbox/database/pom.xml                        | 2 +-
 sandbox/dropwizard/pom.xml                      | 2 +-
 sandbox/mgmt/pom.xml                            | 2 +-
 sandbox/nosql/pom.xml                           | 2 +-
 sandbox/web-acceptance/pom.xml                  | 2 +-
 software/database/pom.xml                       | 2 +-
 software/messaging/pom.xml                      | 2 +-
 software/nosql/pom.xml                          | 2 +-
 software/osgi/pom.xml                           | 2 +-
 software/webapp/pom.xml                         | 2 +-
 usage/qa/pom.xml                                | 2 +-
 usage/qa/start-monitor.sh                       | 2 +-
 usage/qa/start-webcluster.sh                    | 2 +-
 25 files changed, 25 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/global-web-fabric/pom.xml
----------------------------------------------------------------------
diff --git a/examples/global-web-fabric/pom.xml b/examples/global-web-fabric/pom.xml
index ce6e09a..4647a2e 100644
--- a/examples/global-web-fabric/pom.xml
+++ b/examples/global-web-fabric/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/hadoop-and-whirr/pom.xml
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/pom.xml b/examples/hadoop-and-whirr/pom.xml
index 866e197..6438e6f 100644
--- a/examples/hadoop-and-whirr/pom.xml
+++ b/examples/hadoop-and-whirr/pom.xml
@@ -8,7 +8,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index bb82c5f..12acedc 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -15,7 +15,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/simple-messaging-pubsub/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-messaging-pubsub/pom.xml b/examples/simple-messaging-pubsub/pom.xml
index fc0ed51..6113683 100644
--- a/examples/simple-messaging-pubsub/pom.xml
+++ b/examples/simple-messaging-pubsub/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/simple-nosql-cluster/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-nosql-cluster/pom.xml b/examples/simple-nosql-cluster/pom.xml
index 4624cfb..eeda641 100644
--- a/examples/simple-nosql-cluster/pom.xml
+++ b/examples/simple-nosql-cluster/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/simple-open-loop-policy/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-open-loop-policy/pom.xml b/examples/simple-open-loop-policy/pom.xml
index ab5c816..ec76efe 100644
--- a/examples/simple-open-loop-policy/pom.xml
+++ b/examples/simple-open-loop-policy/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/simple-web-cluster/pom.xml
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/pom.xml b/examples/simple-web-cluster/pom.xml
index 9e4452f..a4961c6 100644
--- a/examples/simple-web-cluster/pom.xml
+++ b/examples/simple-web-cluster/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/webapps/hello-world-hadoop-jar/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webapps/hello-world-hadoop-jar/pom.xml b/examples/webapps/hello-world-hadoop-jar/pom.xml
index 5da2a51..87b5fd0 100644
--- a/examples/webapps/hello-world-hadoop-jar/pom.xml
+++ b/examples/webapps/hello-world-hadoop-jar/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-webapps-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/webapps/hello-world-hadoop/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webapps/hello-world-hadoop/pom.xml b/examples/webapps/hello-world-hadoop/pom.xml
index a27a1b0..db24c8e 100644
--- a/examples/webapps/hello-world-hadoop/pom.xml
+++ b/examples/webapps/hello-world-hadoop/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-webapps-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/webapps/hello-world-sql/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webapps/hello-world-sql/pom.xml b/examples/webapps/hello-world-sql/pom.xml
index ed3690d..7591cde 100644
--- a/examples/webapps/hello-world-sql/pom.xml
+++ b/examples/webapps/hello-world-sql/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-webapps-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version> <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version> <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/webapps/hello-world-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webapps/hello-world-webapp/pom.xml b/examples/webapps/hello-world-webapp/pom.xml
index 07c31fd..12214fd 100644
--- a/examples/webapps/hello-world-webapp/pom.xml
+++ b/examples/webapps/hello-world-webapp/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-webapps-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/examples/webapps/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webapps/pom.xml b/examples/webapps/pom.xml
index 966ec38..e6be4f5 100644
--- a/examples/webapps/pom.xml
+++ b/examples/webapps/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>io.brooklyn.example</groupId>
         <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/sandbox/database/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/database/pom.xml b/sandbox/database/pom.xml
index 78fa429..e1644a6 100644
--- a/sandbox/database/pom.xml
+++ b/sandbox/database/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/sandbox/dropwizard/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/dropwizard/pom.xml b/sandbox/dropwizard/pom.xml
index f1b8ada..eb16d5b 100644
--- a/sandbox/dropwizard/pom.xml
+++ b/sandbox/dropwizard/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/sandbox/mgmt/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/mgmt/pom.xml b/sandbox/mgmt/pom.xml
index 3bcc365..ff267aa 100644
--- a/sandbox/mgmt/pom.xml
+++ b/sandbox/mgmt/pom.xml
@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
     

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/sandbox/nosql/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/nosql/pom.xml b/sandbox/nosql/pom.xml
index d5f0b1b..116736e 100644
--- a/sandbox/nosql/pom.xml
+++ b/sandbox/nosql/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/sandbox/web-acceptance/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/web-acceptance/pom.xml b/sandbox/web-acceptance/pom.xml
index ec2ec14..fda765b 100644
--- a/sandbox/web-acceptance/pom.xml
+++ b/sandbox/web-acceptance/pom.xml
@@ -9,7 +9,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>   <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/software/database/pom.xml
----------------------------------------------------------------------
diff --git a/software/database/pom.xml b/software/database/pom.xml
index 14c34cb..352c551 100644
--- a/software/database/pom.xml
+++ b/software/database/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/software/messaging/pom.xml
----------------------------------------------------------------------
diff --git a/software/messaging/pom.xml b/software/messaging/pom.xml
index 7a81336..07755f4 100644
--- a/software/messaging/pom.xml
+++ b/software/messaging/pom.xml
@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/software/nosql/pom.xml
----------------------------------------------------------------------
diff --git a/software/nosql/pom.xml b/software/nosql/pom.xml
index aff6491..cdb5d13 100644
--- a/software/nosql/pom.xml
+++ b/software/nosql/pom.xml
@@ -10,7 +10,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/software/osgi/pom.xml
----------------------------------------------------------------------
diff --git a/software/osgi/pom.xml b/software/osgi/pom.xml
index 8c7f33d..8be98c8 100644
--- a/software/osgi/pom.xml
+++ b/software/osgi/pom.xml
@@ -11,7 +11,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/software/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/software/webapp/pom.xml b/software/webapp/pom.xml
index 5dca738..1e3f53a 100644
--- a/software/webapp/pom.xml
+++ b/software/webapp/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/usage/qa/pom.xml
----------------------------------------------------------------------
diff --git a/usage/qa/pom.xml b/usage/qa/pom.xml
index eede372..c4b65cb 100644
--- a/usage/qa/pom.xml
+++ b/usage/qa/pom.xml
@@ -10,7 +10,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.5.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/usage/qa/start-monitor.sh
----------------------------------------------------------------------
diff --git a/usage/qa/start-monitor.sh b/usage/qa/start-monitor.sh
index d03bb3a..e807f2b 100755
--- a/usage/qa/start-monitor.sh
+++ b/usage/qa/start-monitor.sh
@@ -8,7 +8,7 @@
 
 CLASS=brooklyn.qa.longevity.Monitor
 # BROOKLYN_VERSION_BELOW
-VERSION=0.5.0-SNAPSHOT
+VERSION=0.5.0
 
 ROOT=$(cd $(dirname $0) && pwd)
 cd $ROOT

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0e094fa8/usage/qa/start-webcluster.sh
----------------------------------------------------------------------
diff --git a/usage/qa/start-webcluster.sh b/usage/qa/start-webcluster.sh
index 9a9358f..0b5d938 100755
--- a/usage/qa/start-webcluster.sh
+++ b/usage/qa/start-webcluster.sh
@@ -8,7 +8,7 @@
 
 CLASS=brooklyn.qa.longevity.webcluster.WebClusterApp
 # BROOKLYN_VERSION_BELOW
-VERSION=0.5.0-SNAPSHOT
+VERSION=0.5.0
 
 ROOT=$(cd $(dirname $0) && pwd)
 cd $ROOT


[28/50] brooklyn-library git commit: Move common driver code to shared parent class

Posted by he...@apache.org.
Move common driver code to shared parent class


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/df84b662
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/df84b662
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/df84b662

Branch: refs/heads/0.5.0
Commit: df84b662b5d8dfb757f713ae997065d4a8f7882d
Parents: a24e0e4
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Mar 21 02:22:57 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../kafka/AbstractfKafkaSshDriver.java          | 170 +++++++++++++++++++
 .../messaging/kafka/KafkaBrokerSshDriver.java   | 129 ++------------
 .../kafka/KafkaZookeeperSshDriver.java          | 129 ++------------
 3 files changed, 198 insertions(+), 230 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/df84b662/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
new file mode 100644
index 0000000..f6c7c8d
--- /dev/null
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/AbstractfKafkaSshDriver.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2013 by Cloudsoft Corp.
+ *
+ * Licensed 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.messaging.kafka;
+
+import static java.lang.String.format;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.BrooklynVersion;
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.basic.lifecycle.CommonCommands;
+import brooklyn.entity.drivers.downloads.DownloadResolver;
+import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.util.MutableMap;
+import brooklyn.util.NetworkUtils;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.jmx.jmxrmi.JmxRmiAgent;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public abstract class AbstractfKafkaSshDriver extends JavaSoftwareProcessSshDriver {
+
+    private static final Logger log = LoggerFactory.getLogger(KafkaZookeeperSshDriver.class);
+
+    public AbstractfKafkaSshDriver(EntityLocal entity, SshMachineLocation machine) {
+        super(entity, machine);
+    }
+
+    protected abstract Map<String, Integer> getPortMap();
+
+    protected abstract ConfigKey<String> getConfigTemplateKey();
+
+    protected abstract String getConfigFileName();
+
+    protected abstract String getLaunchScriptName();
+
+    protected abstract String getProcessIdentifier();
+
+    private String expandedInstallDir;
+
+    @Override
+    protected String getLogFileLocation() { return getRunDir()+"/console.out"; }
+
+    private String getExpandedInstallDir() {
+        if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
+        return expandedInstallDir;
+    }
+
+    @Override
+    public void install() {
+        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
+        List<String> urls = resolver.getTargets();
+        String saveAs = resolver.getFilename();
+        expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));
+
+        List<String> commands = new LinkedList<String>();
+        commands.addAll(CommonCommands.downloadUrlAs(urls, saveAs));
+        commands.add(CommonCommands.INSTALL_TAR);
+        commands.add("tar xzfv "+saveAs);
+        commands.add("cd "+expandedInstallDir);
+        commands.add("./sbt update");
+        commands.add("./sbt package");
+
+        newScript(INSTALLING)
+                .failOnNonZeroResultCode()
+                .body.append(commands)
+                .execute();
+    }
+
+    @Override
+    public void customize() {
+        NetworkUtils.checkPortsValid(getPortMap());
+        newScript(CUSTOMIZING)
+                .failOnNonZeroResultCode()
+                .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
+                .execute();
+
+        String config = entity.getConfig(getConfigTemplateKey());
+        copyTemplate(config, getConfigFileName());
+
+        // Copy JMX agent Jar to server
+        getMachine().copyTo(new ResourceUtils(this).getResourceFromUrl(getJmxRmiAgentJarUrl()), getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    public String getJmxRmiAgentJarBasename() {
+        return "brooklyn-jmxrmi-agent-" + BrooklynVersion.get() + ".jar";
+    }
+
+    public String getJmxRmiAgentJarUrl() {
+        return "classpath://" + getJmxRmiAgentJarBasename();
+    }
+
+    public String getJmxRmiAgentJarDestinationFilePath() {
+        return getRunDir() + "/" + getJmxRmiAgentJarBasename();
+    }
+
+    @Override
+    public void launch() {
+        newScript(ImmutableMap.of("usePidFile", getPidFile()), LAUNCHING)
+                .failOnNonZeroResultCode()
+                .body.append(String.format("nohup ./bin/%s ./%s > console.out 2>&1 &", getLaunchScriptName(), getConfigFileName()))
+                .execute();
+    }
+
+    public String getPidFile() { return getRunDir() + "/kafka.pid"; }
+
+    @Override
+    public boolean isRunning() {
+        return newScript(ImmutableMap.of("usePidFile", getPidFile()), CHECK_RUNNING).execute() == 0;
+    }
+
+    @Override
+    public void stop() {
+        newScript(ImmutableMap.of("usePidFile", false), STOPPING)
+                .body.append(String.format("ps ax | grep %s | awk '{print $1}' | xargs kill", getProcessIdentifier()))
+                .body.append(String.format("ps ax | grep %s | awk '{print $1}' | xargs kill -9", getProcessIdentifier()))
+                .execute();
+    }
+
+    @Override
+    protected Map<String, ?> getJmxJavaSystemProperties() {
+        return MutableMap.<String, Object> builder()
+                .put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, getJmxPort())
+                .put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, getRmiServerPort())
+                .put("com.sun.management.jmxremote.ssl", false)
+                .put("com.sun.management.jmxremote.authenticate", false)
+                .put("java.rmi.server.hostname", getHostname())
+                .build();
+    }
+
+    @Override
+    protected List<String> getJmxJavaConfigOptions() {
+        return ImmutableList.of("-javaagent:" + getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    /**
+     * Use RMI agent to provide JMX.
+     */
+    @Override
+    public Map<String, String> getShellEnvironment() {
+        Map<String, String> orig = super.getShellEnvironment();
+        String kafkaJmxOpts = orig.remove("JAVA_OPTS");
+        return MutableMap.<String, String>builder()
+                .putAll(orig)
+                .put("KAFKA_JMX_OPTS", kafkaJmxOpts)
+                .build();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/df84b662/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
index b3cd0f0..40e7234 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerSshDriver.java
@@ -15,147 +15,46 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import static java.lang.String.format;
-
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.BrooklynVersion;
-import brooklyn.entity.basic.lifecycle.CommonCommands;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
-import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
+import brooklyn.config.ConfigKey;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
-import brooklyn.util.NetworkUtils;
-import brooklyn.util.ResourceUtils;
-import brooklyn.util.jmx.jmxrmi.JmxRmiAgent;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public class KafkaBrokerSshDriver extends JavaSoftwareProcessSshDriver implements KafkaBrokerDriver {
 
-    private static final Logger log = LoggerFactory.getLogger(KafkaBrokerSshDriver.class);
-
-    private String expandedInstallDir;
+public class KafkaBrokerSshDriver extends AbstractfKafkaSshDriver implements KafkaBrokerDriver {
 
     public KafkaBrokerSshDriver(KafkaBrokerImpl entity, SshMachineLocation machine) {
         super(entity, machine);
     }
 
     @Override
-    protected String getLogFileLocation() { return getRunDir()+"/console.out"; }
-
-    @Override
-    public Integer getKafkaPort() { return entity.getAttribute(KafkaBroker.KAFKA_PORT); }
-
-    private String getExpandedInstallDir() {
-        if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
-        return expandedInstallDir;
-    }
-
-    @Override
-    public void install() {
-        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
-        List<String> urls = resolver.getTargets();
-        String saveAs = resolver.getFilename();
-        expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));
-
-        List<String> commands = new LinkedList<String>();
-        commands.addAll(CommonCommands.downloadUrlAs(urls, saveAs));
-        commands.add(CommonCommands.INSTALL_TAR);
-        commands.add("tar xzfv "+saveAs);
-        commands.add("cd "+expandedInstallDir);
-        commands.add("./sbt update");
-        commands.add("./sbt package");
-
-        newScript(INSTALLING)
-                .failOnNonZeroResultCode()
-                .body.append(commands)
-                .execute();
-    }
-
-    @Override
-    public void customize() {
-        NetworkUtils.checkPortsValid(MutableMap.of("kafkaPort", getKafkaPort()));
-        newScript(CUSTOMIZING)
-                .failOnNonZeroResultCode()
-                .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
-                .execute();
-
-        String serverConfig = entity.getConfig(KafkaBroker.SERVER_CONFIG_TEMPLATE);
-        copyTemplate(serverConfig, "server.properties");
-
-        // Copy JMX agent Jar to server
-        getMachine().copyTo(new ResourceUtils(this).getResourceFromUrl(getJmxRmiAgentJarUrl()), getJmxRmiAgentJarDestinationFilePath());
-    }
-
-    public String getJmxRmiAgentJarBasename() {
-        return "brooklyn-jmxrmi-agent-" + BrooklynVersion.get() + ".jar";
-    }
-
-    public String getJmxRmiAgentJarUrl() {
-        return "classpath://" + getJmxRmiAgentJarBasename();
-    }
-
-    public String getJmxRmiAgentJarDestinationFilePath() {
-        return getRunDir() + "/" + getJmxRmiAgentJarBasename();
-    }
-
-    @Override
-    public void launch() {
-        newScript(ImmutableMap.of("usePidFile", getPidFile()), LAUNCHING)
-                .failOnNonZeroResultCode()
-                .body.append("nohup ./bin/kafka-server-start.sh ./server.properties > console.out 2>&1 &")
-                .execute();
+    protected Map<String, Integer> getPortMap() {
+        return MutableMap.of("kafkaPort", getKafkaPort());
     }
 
-    public String getPidFile() { return getRunDir() + "/kafka.pid"; }
-
     @Override
-    public boolean isRunning() {
-        return newScript(ImmutableMap.of("usePidFile", getPidFile()), CHECK_RUNNING).execute() == 0;
+    protected ConfigKey<String> getConfigTemplateKey() {
+        return KafkaBroker.SERVER_CONFIG_TEMPLATE;
     }
 
     @Override
-    public void stop() {
-        newScript(ImmutableMap.of("usePidFile", false), STOPPING)
-                .body.append("ps ax | grep kafka\\.Kafka | awk '{print $1}' | xargs kill")
-                .body.append("ps ax | grep kafka\\.Kafka | awk '{print $1}' | xargs kill -9")
-                .execute();
+    protected String getConfigFileName() {
+        return "server.properties";
     }
 
     @Override
-    protected Map<String, ?> getJmxJavaSystemProperties() {
-        return MutableMap.<String, Object> builder()
-                .put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, getJmxPort())
-                .put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, getRmiServerPort())
-                .put("com.sun.management.jmxremote.ssl", false)
-                .put("com.sun.management.jmxremote.authenticate", false)
-                .put("java.rmi.server.hostname", getHostname())
-                .build();
+    protected String getLaunchScriptName() {
+        return "kafka-server-start.sh";
     }
 
     @Override
-    protected List<String> getJmxJavaConfigOptions() {
-        return ImmutableList.of("-javaagent:" + getJmxRmiAgentJarDestinationFilePath());
+    protected String getProcessIdentifier() {
+        return "kafka\\.Kafka";
     }
 
-    /**
-     * Use RMI agent to provide JMX.
-     */
     @Override
-    public Map<String, String> getShellEnvironment() {
-        Map<String, String> orig = super.getShellEnvironment();
-        String kafkaJmxOpts = orig.remove("JAVA_OPTS");
-        return MutableMap.<String, String>builder()
-                .putAll(orig)
-                .put("KAFKA_JMX_OPTS", kafkaJmxOpts)
-                .build();
+    public Integer getKafkaPort() {
+        return getEntity().getAttribute(KafkaBroker.KAFKA_PORT);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/df84b662/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
index c62cb0a..a35aab6 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
@@ -15,147 +15,46 @@
  */
 package brooklyn.entity.messaging.kafka;
 
-import static java.lang.String.format;
-
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.BrooklynVersion;
-import brooklyn.entity.basic.lifecycle.CommonCommands;
-import brooklyn.entity.drivers.downloads.DownloadResolver;
-import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
+import brooklyn.config.ConfigKey;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
-import brooklyn.util.NetworkUtils;
-import brooklyn.util.ResourceUtils;
-import brooklyn.util.jmx.jmxrmi.JmxRmiAgent;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implements KafkaZookeeperDriver {
 
-    private static final Logger log = LoggerFactory.getLogger(KafkaZookeeperSshDriver.class);
-
-    private String expandedInstallDir;
+public class KafkaZookeeperSshDriver extends AbstractfKafkaSshDriver implements KafkaZookeeperDriver {
 
     public KafkaZookeeperSshDriver(KafkaZookeeperImpl entity, SshMachineLocation machine) {
         super(entity, machine);
     }
 
     @Override
-    protected String getLogFileLocation() { return getRunDir()+"/console.out"; }
-
-    @Override
-    public Integer getZookeeperPort() { return entity.getAttribute(KafkaZookeeper.ZOOKEEPER_PORT); }
-
-    private String getExpandedInstallDir() {
-        if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
-        return expandedInstallDir;
-    }
-
-    @Override
-    public void install() {
-        DownloadResolver resolver = entity.getManagementContext().getEntityDownloadsManager().newDownloader(this);
-        List<String> urls = resolver.getTargets();
-        String saveAs = resolver.getFilename();
-        expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("kafka-%s-src", getVersion()));
-
-        List<String> commands = new LinkedList<String>();
-        commands.addAll(CommonCommands.downloadUrlAs(urls, saveAs));
-        commands.add(CommonCommands.INSTALL_TAR);
-        commands.add("tar xzfv "+saveAs);
-        commands.add("cd "+expandedInstallDir);
-        commands.add("./sbt update");
-        commands.add("./sbt package");
-
-        newScript(INSTALLING)
-                .failOnNonZeroResultCode()
-                .body.append(commands)
-                .execute();
-    }
-
-    @Override
-    public void customize() {
-        NetworkUtils.checkPortsValid(MutableMap.of("zookeeperPort", getZookeeperPort()));
-        newScript(CUSTOMIZING)
-                .failOnNonZeroResultCode()
-                .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
-                .execute();
-
-        String zookeeperConfig = entity.getConfig(KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE);
-        copyTemplate(zookeeperConfig, "zookeeper.properties");
-
-        // Copy JMX agent Jar to server
-        getMachine().copyTo(new ResourceUtils(this).getResourceFromUrl(getJmxRmiAgentJarUrl()), getJmxRmiAgentJarDestinationFilePath());
-    }
-
-    public String getJmxRmiAgentJarBasename() {
-        return "brooklyn-jmxrmi-agent-" + BrooklynVersion.get() + ".jar";
-    }
-
-    public String getJmxRmiAgentJarUrl() {
-        return "classpath://" + getJmxRmiAgentJarBasename();
-    }
-
-    public String getJmxRmiAgentJarDestinationFilePath() {
-        return getRunDir() + "/" + getJmxRmiAgentJarBasename();
-    }
-
-    @Override
-    public void launch() {
-        newScript(ImmutableMap.of("usePidFile", getPidFile()), LAUNCHING)
-                .failOnNonZeroResultCode()
-                .body.append("nohup ./bin/zookeeper-server-start.sh ./zookeeper.properties > console.out 2>&1 &")
-                .execute();
+    protected Map<String, Integer> getPortMap() {
+        return MutableMap.of("zookeeperPort", getZookeeperPort());
     }
 
-    public String getPidFile() { return getRunDir() + "/kafka.pid"; }
-
     @Override
-    public boolean isRunning() {
-        return newScript(ImmutableMap.of("usePidFile", getPidFile()), CHECK_RUNNING).execute() == 0;
+    protected ConfigKey<String> getConfigTemplateKey() {
+        return KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE;
     }
 
     @Override
-    public void stop() {
-        newScript(ImmutableMap.of("usePidFile", false), STOPPING)
-                .body.append("ps ax | grep quorum\\.QuorumPeerMain | awk '{print $1}' | xargs kill")
-                .body.append("ps ax | grep quorum\\.QuorumPeerMain | awk '{print $1}' | xargs kill -9")
-                .execute();
+    protected String getConfigFileName() {
+        return "zookeeper.properties";
     }
 
     @Override
-    protected Map<String, ?> getJmxJavaSystemProperties() {
-        return MutableMap.<String, Object> builder()
-                .put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, getJmxPort())
-                .put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, getRmiServerPort())
-                .put("com.sun.management.jmxremote.ssl", false)
-                .put("com.sun.management.jmxremote.authenticate", false)
-                .put("java.rmi.server.hostname", getHostname())
-                .build();
+    protected String getLaunchScriptName() {
+        return "zookeeper-server-start.sh";
     }
 
     @Override
-    protected List<String> getJmxJavaConfigOptions() {
-        return ImmutableList.of("-javaagent:" + getJmxRmiAgentJarDestinationFilePath());
+    protected String getProcessIdentifier() {
+        return "quorum\\.QuorumPeerMain";
     }
 
-    /**
-     * Use RMI agent to provide JMX.
-     */
     @Override
-    public Map<String, String> getShellEnvironment() {
-        Map<String, String> orig = super.getShellEnvironment();
-        String kafkaJmxOpts = orig.remove("JAVA_OPTS");
-        return MutableMap.<String, String>builder()
-                .putAll(orig)
-                .put("KAFKA_JMX_OPTS", kafkaJmxOpts)
-                .build();
+    public Integer getZookeeperPort() {
+        return getEntity().getAttribute(KafkaZookeeper.ZOOKEEPER_PORT);
     }
 
 }


[42/50] brooklyn-library git commit: Fix template reference to redisPort

Posted by he...@apache.org.
Fix template reference to redisPort


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/79e666f0
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/79e666f0
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/79e666f0

Branch: refs/heads/0.5.0
Commit: 79e666f0174f17828ef275415375d4d98e5f7d20
Parents: e9cb157
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Mon Apr 22 15:46:24 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:44 2013 +0100

----------------------------------------------------------------------
 .../java/brooklyn/entity/nosql/redis/RedisStore.java  |  2 ++
 .../brooklyn/entity/nosql/redis/RedisStoreImpl.java   | 14 ++++++++++++--
 .../entity/nosql/redis/RedisStoreSshDriver.java       | 11 +----------
 .../resources/brooklyn/entity/nosql/redis/redis.conf  |  4 ++--
 .../resources/brooklyn/entity/nosql/redis/slave.conf  |  7 +++++--
 5 files changed, 22 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/79e666f0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
index 492da2d..3717ffc 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
@@ -41,4 +41,6 @@ public interface RedisStore extends SoftwareProcess, DataStore {
 
     String getAddress();
 
+    Integer getRedisPort();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/79e666f0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
index bf6c171..ac8b5aa 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
@@ -1,7 +1,5 @@
 package brooklyn.entity.nosql.redis;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
 import java.util.Map;
 
 import javax.annotation.Nullable;
@@ -14,6 +12,7 @@ import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.event.feed.ssh.SshFeed;
 import brooklyn.event.feed.ssh.SshPollConfig;
 import brooklyn.event.feed.ssh.SshValueFunctions;
+import brooklyn.location.Location;
 import brooklyn.location.MachineLocation;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
@@ -54,8 +53,14 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
 
         connectServiceUpIsRunning();
 
+        // Find an SshMachineLocation for the UPTIME feed
+        Optional<Location> location = Iterables.tryFind(getLocations(), Predicates.instanceOf(SshMachineLocation.class));
+        if (!location.isPresent()) throw new IllegalStateException("Could not find SshMachineLocation in list of locations");
+        SshMachineLocation machine = (SshMachineLocation) location.get();
+
         sshFeed = SshFeed.builder()
                 .entity(this)
+                .machine(machine)
                 .poll(new SshPollConfig<Integer>(UPTIME)
                         .command(getDriver().getRunDir() + "/bin/redis-cli info")
                         .onError(Functions.constant(-1))
@@ -98,4 +103,9 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
         return (machine != null) ? machine.getAddress().getHostAddress() : null;
     }
 
+    @Override
+    public Integer getRedisPort() {
+        return getAttribute(RedisStore.REDIS_PORT);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/79e666f0/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 7cbe3c7..9b17057 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -25,20 +25,11 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
         super(entity, machine);
     }
 
-    @Override
-    public RedisStoreImpl getEntity() {
-        return (RedisStoreImpl) super.getEntity();
-    }
-    
-    protected Integer getRedisPort() {
-        return getEntity().getAttribute(RedisStore.REDIS_PORT);
-    }
-
     private String getExpandedInstallDir() {
         if (expandedInstallDir == null) throw new IllegalStateException("expandedInstallDir is null; most likely install was not called");
         return expandedInstallDir;
     }
-    
+
     @Override
     public void install() {
         DownloadResolver resolver = Entities.newDownloader(this);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/79e666f0/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
index b2dd5cb..0554eb2 100644
--- a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/redis.conf
@@ -5,8 +5,8 @@ daemonize yes
 pidfile ${driver.runDir}/pid.txt
 
 # Set port and optional bind address
-port ${entity.port}
-# bind ${driver.machine.address}
+port ${entity.redisPort?c}
+# bind ${entity.address}
 
 # Configure logging
 loglevel verbose

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/79e666f0/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
index b2dd5cb..3a9e64a 100644
--- a/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
+++ b/software/nosql/src/main/resources/brooklyn/entity/nosql/redis/slave.conf
@@ -5,8 +5,11 @@ daemonize yes
 pidfile ${driver.runDir}/pid.txt
 
 # Set port and optional bind address
-port ${entity.port}
-# bind ${driver.machine.address}
+port ${entity.redisPort?c}
+# bind ${entity.address}
+
+# Slave configuration
+slaveof ${entity.master.address} ${entity.master.redisPort?c}
 
 # Configure logging
 loglevel verbose


[02/50] brooklyn-library git commit: Deprecate LanguageUtils

Posted by he...@apache.org.
Deprecate LanguageUtils

- brooklyn.util.internal.LanguageUtils is a groovy class
- Did some very minor cleanup, and deprecated it
  so we are free to completely change it in 0.6!

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/a5c52c08
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/a5c52c08
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/a5c52c08

Branch: refs/heads/0.5.0
Commit: a5c52c081b6df641708f8ca9efbed4abf4b02bea
Parents: fde9b49
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 08:19:34 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 08:19:34 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/mgmt/federated/FederatingManagementContext.groovy | 3 ++-
 sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy      | 2 --
 .../brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java  | 4 ++--
 .../java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy  | 6 +++---
 4 files changed, 7 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a5c52c08/sandbox/mgmt/src/main/java/brooklyn/mgmt/federated/FederatingManagementContext.groovy
----------------------------------------------------------------------
diff --git a/sandbox/mgmt/src/main/java/brooklyn/mgmt/federated/FederatingManagementContext.groovy b/sandbox/mgmt/src/main/java/brooklyn/mgmt/federated/FederatingManagementContext.groovy
index 7623f0a..c85f8d1 100644
--- a/sandbox/mgmt/src/main/java/brooklyn/mgmt/federated/FederatingManagementContext.groovy
+++ b/sandbox/mgmt/src/main/java/brooklyn/mgmt/federated/FederatingManagementContext.groovy
@@ -21,6 +21,7 @@ import brooklyn.management.internal.AbstractManagementContext
 import brooklyn.management.internal.CollectionChangeListener
 import brooklyn.management.internal.LocalManagementContext
 import brooklyn.util.internal.LanguageUtils
+import brooklyn.util.text.Identifiers
 
 public class FederatingManagementContext extends AbstractManagementContext {
     
@@ -84,7 +85,7 @@ public class FederatingManagementContext extends AbstractManagementContext {
     public EntityManager getEntityManager() { return rem.getContext().getEntityManager(); }
     
     public void onApplicationStart(Application app) {
-        String remoteNodeUid = LanguageUtils.newUid();
+        String remoteNodeUid = Identifiers.makeRandomId(8);
         c.addListener(new NodeStartListener());
         c.put(remoteNodeUid, BrooklynManagementNode.WELCOME_MESSAGE);
         

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a5c52c08/sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy
----------------------------------------------------------------------
diff --git a/sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy b/sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy
index 3e090be..59c87fe 100644
--- a/sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy
+++ b/sandbox/mgmt/src/test/java/example/infinispan/OneA.groovy
@@ -6,8 +6,6 @@ import org.infinispan.config.GlobalConfiguration
 import org.infinispan.manager.DefaultCacheManager
 import org.infinispan.manager.EmbeddedCacheManager
 
-import brooklyn.util.internal.LanguageUtils;
-
 public class OneA {
     
     public static void main(String[] args) throws Exception {

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a5c52c08/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java
index dda06b2..0cd3d27 100644
--- a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java
+++ b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerEc2LiveTest.java
@@ -8,7 +8,7 @@ import brooklyn.entity.AbstractEc2LiveTest;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.location.Location;
 import brooklyn.test.EntityTestUtils;
-import brooklyn.util.internal.LanguageUtils;
+import brooklyn.util.text.Identifiers;
 
 import com.google.common.collect.ImmutableList;
 
@@ -20,7 +20,7 @@ public class KarafContainerEc2LiveTest extends AbstractEc2LiveTest {
     @Override
     protected void doTest(Location loc) throws Exception {
         KarafContainer karaf = app.createAndManageChild(EntitySpecs.spec(KarafContainer.class)
-                .configure("name", LanguageUtils.newUid())
+                .configure("name", Identifiers.makeRandomId(8))
                 .configure("displayName", "Karaf Test")
                 .configure("jmxPort", "8099+")
                 .configure("rmiServerPort", "9099+"));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a5c52c08/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
----------------------------------------------------------------------
diff --git a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
index e046a0f..a30e699 100644
--- a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
+++ b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
@@ -17,8 +17,8 @@ import brooklyn.entity.trait.Startable
 import brooklyn.location.MachineProvisioningLocation
 import brooklyn.location.basic.LocalhostMachineProvisioningLocation
 import brooklyn.test.entity.TestApplication
-import brooklyn.util.internal.LanguageUtils
 import brooklyn.util.internal.TimeExtras
+import brooklyn.util.text.Identifiers
 
 public class KarafContainerTest {
     static { TimeExtras.init() }
@@ -42,7 +42,7 @@ public class KarafContainerTest {
     @Test(groups = ["Integration", "WIP"])
     public void canStartupAndShutdown() {
         karaf = app.createAndManageChild(EntitySpecs.spec(KarafContainer.class)
-                .configure("name", LanguageUtils.newUid())
+                .configure("name", Identifiers.makeRandomId(8))
                 .configure("displayName", "Karaf Test")
                 .configure("jmxPort", "8099+")
                 .configure("rmiServerPort", "9099+"));
@@ -64,7 +64,7 @@ public class KarafContainerTest {
     @Test(groups = ["Integration", "WIP"])
     public void testCanInstallAndUninstallBundle() {
         karaf = app.createAndManageChild(EntitySpecs.spec(KarafContainer.class)
-            .configure("name", LanguageUtils.newUid())
+            .configure("name", Identifiers.makeRandomId(8))
             .configure("displayName", "Karaf Test")
             .configure("jmxPort", "8099+")
             .configure("rmiServerPort", "9099+"));


[03/50] brooklyn-library git commit: Fix WebAppIntegrationTest

Posted by he...@apache.org.
Fix WebAppIntegrationTest

- ensureTomcatIsShutdown needs dependsOnMethod="shutdownApp",
  otherwise fails because nothing previously asked tomcat
  to shutdown.

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/2a28206a
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/2a28206a
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/2a28206a

Branch: refs/heads/0.5.0
Commit: 2a28206ac5c56350a4e9d3c9edee09ee24fcbd51
Parents: a5c52c0
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 08:37:32 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 08:37:32 2013 +0000

----------------------------------------------------------------------
 .../entity/webapp/WebAppIntegrationTest.groovy  | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2a28206a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
index 80a0da7..f9414d1 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppIntegrationTest.groovy
@@ -90,7 +90,7 @@ public class WebAppIntegrationTest {
         }
     }
 
-    @AfterMethod(alwaysRun=true)
+    @AfterMethod(alwaysRun=true, dependsOnMethods="shutdownApp")
     public void ensureTomcatIsShutDown() {
         Socket shutdownSocket = null;
         SocketException gotException = null;
@@ -110,17 +110,17 @@ public class WebAppIntegrationTest {
                 .run();
     
             if (socketClosed == false) {
-                log.error "Tomcat did not shut down - this is a failure of the last test run";
-                log.warn "I'm sending a message to the Tomcat shutdown port";
-                OutputStreamWriter writer = new OutputStreamWriter(shutdownSocket.getOutputStream());
-                writer.write("SHUTDOWN\r\n");
-                writer.flush();
-                writer.close();
-                shutdownSocket.close();
-                throw new Exception("Last test run did not shut down Tomcat")
+//                log.error("Tomcat did not shut down - this is a failure of the last test run");
+//                log.warn("I'm sending a message to the Tomcat shutdown port {}", shutdownPort);
+//                OutputStreamWriter writer = new OutputStreamWriter(shutdownSocket.getOutputStream());
+//                writer.write("SHUTDOWN\r\n");
+//                writer.flush();
+//                writer.close();
+//                shutdownSocket.close();
+                throw new Exception("Last test run did not shut down Tomcat entity "+entity+" (port "+shutdownPort+")");
             }
         } else {
-            log.info "Cannot shutdown, because shutdown-port not set for $entity";
+            log.info("Cannot shutdown, because shutdown-port not set for {}", entity);
         }
     }
 


[26/50] brooklyn-library git commit: Fix port check and sensor name and use RMI agent for JMX in zookeeper

Posted by he...@apache.org.
Fix port check and sensor name and use RMI agent for JMX in zookeeper


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/a24e0e4b
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/a24e0e4b
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/a24e0e4b

Branch: refs/heads/0.5.0
Commit: a24e0e4b8e4b41ac7458778ed0c2532cfbfbf53d
Parents: ea32c5a
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Mar 21 01:50:47 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:07 2013 +0100

----------------------------------------------------------------------
 .../entity/messaging/kafka/KafkaBroker.java     |  2 +-
 .../entity/messaging/kafka/KafkaBrokerImpl.java | 12 +----
 .../messaging/kafka/KafkaClusterImpl.java       |  4 +-
 .../messaging/kafka/KafkaZookeeperImpl.java     | 10 +----
 .../kafka/KafkaZookeeperSshDriver.java          | 46 ++++++++++++++++++--
 .../entity/messaging/qpid/QpidBrokerImpl.java   | 11 +----
 6 files changed, 50 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
index 01fa424..33cb7e0 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBroker.java
@@ -43,7 +43,7 @@ public interface KafkaBroker extends SoftwareProcess, MessageBroker, UsesJmx, Ka
             String.class, "kafka.config.server", "Server configuration template (in freemarker format)", "classpath://brooklyn/entity/messaging/kafka/server.properties");
 
     @SetFromFlag("zookeeper")
-    BasicConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "Kafka zookeeper entity");
+    BasicConfigKey<KafkaZookeeper> ZOOKEEPER = new BasicConfigKey<KafkaZookeeper>(KafkaZookeeper.class, "kafka.broker.zookeeper", "Kafka zookeeper entity");
 
     AttributeSensor<Integer> BROKER_ID = new BasicAttributeSensor<Integer>(Integer.class, "kafka.broker.id", "Kafka unique broker ID");
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index ed9ae0c..4dd253e 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -76,7 +76,7 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
     @Override
     public KafkaZookeeper getZookeeper() { return getConfig(ZOOKEEPER); }
 
-    public KafkaTopic createTopic(Map properties) {
+    public KafkaTopic createTopic(Map<?, ?> properties) {
         KafkaTopic result = new KafkaTopic(properties, this);
         Entities.manage(result);
         result.create();
@@ -84,18 +84,10 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
     }
 
     @Override
-    public Class getDriverInterface() {
+    public Class<?> getDriverInterface() {
         return KafkaBrokerDriver.class;
     }
 
-    @Override
-    protected Collection<Integer> getRequiredOpenPorts() {
-        Set<Integer> ports = Sets.newLinkedHashSet(super.getRequiredOpenPorts());
-        ports.add(getAttribute(KAFKA_PORT));
-        log.debug("getRequiredOpenPorts detected expanded ports {} for {}", ports, this);
-        return ports;
-    }
-
     private ObjectName socketServerStatsMbean = JmxHelper.createObjectName("kafka:type=kafka.SocketServerStats");
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
index 969a140..efc14fc 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaClusterImpl.java
@@ -76,11 +76,11 @@ public class KafkaClusterImpl extends AbstractEntity implements KafkaCluster {
         if (zookeeper == null) {
             EntitySpec<KafkaZookeeper> zookeeperSpec = getAttribute(ZOOKEEPER_SPEC);
             if (zookeeperSpec == null) {
-                log.debug("creating controller using default spec for {}", this);
+                log.debug("creating zookeeper using default spec for {}", this);
                 zookeeperSpec = BasicEntitySpec.newInstance(KafkaZookeeper.class);
                 setAttribute(ZOOKEEPER_SPEC, zookeeperSpec);
             } else {
-                log.debug("creating controller using custom spec for {}", this);
+                log.debug("creating zookeeper using custom spec for {}", this);
             }
             zookeeper = getEntityManager().createEntity(WrappingEntitySpec.newInstance(zookeeperSpec).parent(this));
             if (Entities.isManaged(this)) Entities.manage(zookeeper);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
index 8d9d4f4..0554011 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -67,18 +67,10 @@ public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZook
     public String getHostname() { return getAttribute(HOSTNAME); }
 
     @Override
-    public Class getDriverInterface() {
+    public Class<?> getDriverInterface() {
         return KafkaZookeeperDriver.class;
     }
 
-    @Override
-    protected Collection<Integer> getRequiredOpenPorts() {
-        Set<Integer> ports = Sets.newLinkedHashSet(super.getRequiredOpenPorts());
-        ports.add(getAttribute(ZOOKEEPER_PORT));
-        log.debug("getRequiredOpenPorts detected expanded ports {} for {}", ports, this);
-        return ports;
-    }
-
     private ObjectName zookeeperMbean = JmxHelper.createObjectName("org.apache.ZooKeeperService:name0=StandaloneServer_port-1");
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
index bbaaa0d..c62cb0a 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperSshDriver.java
@@ -24,13 +24,17 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.BrooklynVersion;
 import brooklyn.entity.basic.lifecycle.CommonCommands;
 import brooklyn.entity.drivers.downloads.DownloadResolver;
 import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.util.MutableMap;
 import brooklyn.util.NetworkUtils;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.jmx.jmxrmi.JmxRmiAgent;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implements KafkaZookeeperDriver {
@@ -83,8 +87,23 @@ public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implem
                 .body.append(format("cp -R %s/* %s", getExpandedInstallDir(), getRunDir()))
                 .execute();
 
-        String serverConfig = entity.getConfig(KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE);
-        copyTemplate(serverConfig, "zookeeper.properties");
+        String zookeeperConfig = entity.getConfig(KafkaZookeeper.ZOOKEEPER_CONFIG_TEMPLATE);
+        copyTemplate(zookeeperConfig, "zookeeper.properties");
+
+        // Copy JMX agent Jar to server
+        getMachine().copyTo(new ResourceUtils(this).getResourceFromUrl(getJmxRmiAgentJarUrl()), getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    public String getJmxRmiAgentJarBasename() {
+        return "brooklyn-jmxrmi-agent-" + BrooklynVersion.get() + ".jar";
+    }
+
+    public String getJmxRmiAgentJarUrl() {
+        return "classpath://" + getJmxRmiAgentJarBasename();
+    }
+
+    public String getJmxRmiAgentJarDestinationFilePath() {
+        return getRunDir() + "/" + getJmxRmiAgentJarBasename();
     }
 
     @Override
@@ -111,10 +130,31 @@ public class KafkaZookeeperSshDriver extends JavaSoftwareProcessSshDriver implem
     }
 
     @Override
+    protected Map<String, ?> getJmxJavaSystemProperties() {
+        return MutableMap.<String, Object> builder()
+                .put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, getJmxPort())
+                .put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, getRmiServerPort())
+                .put("com.sun.management.jmxremote.ssl", false)
+                .put("com.sun.management.jmxremote.authenticate", false)
+                .put("java.rmi.server.hostname", getHostname())
+                .build();
+    }
+
+    @Override
+    protected List<String> getJmxJavaConfigOptions() {
+        return ImmutableList.of("-javaagent:" + getJmxRmiAgentJarDestinationFilePath());
+    }
+
+    /**
+     * Use RMI agent to provide JMX.
+     */
+    @Override
     public Map<String, String> getShellEnvironment() {
         Map<String, String> orig = super.getShellEnvironment();
+        String kafkaJmxOpts = orig.remove("JAVA_OPTS");
         return MutableMap.<String, String>builder()
-                .put("KAFKA_JMX_OPTS", orig.get("JAVA_OPTS"))
+                .putAll(orig)
+                .put("KAFKA_JMX_OPTS", kafkaJmxOpts)
                 .build();
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/a24e0e4b/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidBrokerImpl.java
index 441e996..938e1e6 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/qpid/QpidBrokerImpl.java
@@ -99,18 +99,9 @@ public class QpidBrokerImpl extends JMSBroker<QpidQueue, QpidTopic> implements Q
     }
 
     @Override
-    protected Collection<Integer> getRequiredOpenPorts() {
-        Set<Integer> ports = Sets.newLinkedHashSet(super.getRequiredOpenPorts());
-        ports.add(getAttribute(AMQP_PORT));
-        ports.add(getAttribute(HTTP_MANAGEMENT_PORT));
-        log.debug("getRequiredOpenPorts detected expanded (qpid) ports {} for {}", ports, this);
-        return ports;
-    }
-
-    @Override
     protected void connectSensors() {
         String serverInfoMBeanName = "org.apache.qpid:type=ServerInformation,name=ServerInformation";
-        
+
         jmxFeed = JmxFeed.builder()
                 .entity(this)
                 .period(500, TimeUnit.MILLISECONDS)


[11/50] brooklyn-library git commit: Convert MonitoredCassandraClusterExample to java

Posted by he...@apache.org.
Convert MonitoredCassandraClusterExample to java


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/8990ab7c
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/8990ab7c
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/8990ab7c

Branch: refs/heads/0.5.0
Commit: 8990ab7c3cffc8edb37cd7156f3a313a897c5a0a
Parents: bccb14f
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 16:44:07 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Apr 1 12:41:40 2013 +0100

----------------------------------------------------------------------
 .../MonitoredCassandraClusterExample.groovy     | 22 --------------------
 .../demo/MonitoredCassandraClusterExample.java  | 20 ++++++++++++++++++
 2 files changed, 20 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8990ab7c/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.groovy
----------------------------------------------------------------------
diff --git a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.groovy b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.groovy
deleted file mode 100644
index f20be57..0000000
--- a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.groovy
+++ /dev/null
@@ -1,22 +0,0 @@
-package brooklyn.demo
-
-import brooklyn.entity.basic.ApplicationBuilder
-import brooklyn.entity.nosql.cassandra.CassandraCluster
-import brooklyn.entity.proxying.EntitySpecs
-
-/** Cassandra Application */
-public class MonitoredCassandraClusterExample extends ApplicationBuilder {
-
-    /**
-     * For overriding, to create and wire together entities.
-     */
-    protected void doBuild() {
-        addChild(EntitySpecs.spec(CassandraCluster.class)
-                .configure("initialSize", "2")
-                .configure("clusterName", "CassandraDemo")
-                .configure("jmxPort", "11099+")
-                .configure("rmiServerPort", "9001+")
-                .configure("thriftPort", "9160+"));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/8990ab7c/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
new file mode 100644
index 0000000..3c1a05f
--- /dev/null
+++ b/examples/monitored-cassandra-cluster/src/main/java/brooklyn/demo/MonitoredCassandraClusterExample.java
@@ -0,0 +1,20 @@
+package brooklyn.demo;
+
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.nosql.cassandra.CassandraCluster;
+import brooklyn.entity.proxying.EntitySpecs;
+
+/** Cassandra Application */
+public class MonitoredCassandraClusterExample extends ApplicationBuilder {
+
+    @Override
+    protected void doBuild() {
+        addChild(EntitySpecs.spec(CassandraCluster.class)
+                .configure("initialSize", "2")
+                .configure("clusterName", "CassandraDemo")
+                .configure("jmxPort", "11099+")
+                .configure("rmiServerPort", "9001+")
+                .configure("thriftPort", "9160+"));
+    }
+
+}


[22/50] brooklyn-library git commit: Wait for JMX availability before setting SERVICE_UP

Posted by he...@apache.org.
Wait for JMX availability before setting SERVICE_UP


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/2ca3ea75
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/2ca3ea75
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/2ca3ea75

Branch: refs/heads/0.5.0
Commit: 2ca3ea75ca987d2e42388999ab734557d791b439
Parents: c143706
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Mar 20 20:08:36 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Fri Apr 19 10:36:06 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/messaging/kafka/Kafka.java  |  1 -
 .../entity/messaging/kafka/KafkaBrokerImpl.java | 28 +++++++++++++++++---
 .../messaging/kafka/KafkaZookeeperImpl.java     | 25 +++++++++++++++--
 .../messaging/kafka/KafkaIntegrationTest.groovy |  2 --
 4 files changed, 47 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2ca3ea75/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
index 7f26f8e..a0e4eef 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/Kafka.java
@@ -17,7 +17,6 @@ package brooklyn.entity.messaging.kafka;
 
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicAttributeSensorAndConfigKey;
 import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.util.flags.SetFromFlag;

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2ca3ea75/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
index ae21118..0abdf45 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaBrokerImpl.java
@@ -15,12 +15,15 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,12 +32,13 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.entity.messaging.MessageBroker;
-import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.feed.function.FunctionFeed;
 import brooklyn.event.feed.function.FunctionPollConfig;
 import brooklyn.event.feed.jmx.JmxAttributePollConfig;
 import brooklyn.event.feed.jmx.JmxFeed;
+import brooklyn.event.feed.jmx.JmxHelper;
 import brooklyn.util.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Functions;
 import com.google.common.base.Objects.ToStringHelper;
@@ -93,13 +97,29 @@ public class KafkaBrokerImpl extends SoftwareProcessImpl implements MessageBroke
         return ports;
     }
 
+    private ObjectName socketServerStatsMbean = JmxHelper.createObjectName("kafka:type=kafka.SocketServerStats");
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;
 
     @Override
-    protected void connectSensors() {
-        String socketServerStatsMbean = "kafka:type=kafka.SocketServerStats";
+    public void waitForServiceUp(long duration, TimeUnit units) {
+        super.waitForServiceUp(duration, units);
+
+        // Wait for the MBean to exist
+        JmxHelper helper = null;
+        try {
+            helper = new JmxHelper(this);
+            helper.connect();
+            helper.assertMBeanExistsEventually(socketServerStatsMbean, units.toMillis(duration));
+        } catch (IOException e) {
+            throw Exceptions.propagate(e);
+        } finally {
+            if (helper != null) helper.disconnect();
+        }
+    }
 
+    @Override
+    protected void connectSensors() {
         functionFeed = FunctionFeed.builder()
                 .entity(this)
                 .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2ca3ea75/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
----------------------------------------------------------------------
diff --git a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
index d941411..a572a75 100644
--- a/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
+++ b/software/messaging/src/main/java/brooklyn/entity/messaging/kafka/KafkaZookeeperImpl.java
@@ -15,12 +15,15 @@
  */
 package brooklyn.entity.messaging.kafka;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
+import javax.management.ObjectName;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +34,9 @@ import brooklyn.event.feed.function.FunctionFeed;
 import brooklyn.event.feed.function.FunctionPollConfig;
 import brooklyn.event.feed.jmx.JmxAttributePollConfig;
 import brooklyn.event.feed.jmx.JmxFeed;
+import brooklyn.event.feed.jmx.JmxHelper;
 import brooklyn.util.MutableMap;
+import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
@@ -76,13 +81,29 @@ public class KafkaZookeeperImpl extends SoftwareProcessImpl implements KafkaZook
         return ports;
     }
 
+    private ObjectName zookeeperMbean = JmxHelper.createObjectName("org.apache.ZooKeeperService:name0=StandaloneServer_port-1");
     private volatile FunctionFeed functionFeed;
     private volatile JmxFeed jmxFeed;
 
     @Override
-    protected void connectSensors() {
-        String zookeeperMbean = "org.apache.ZooKeeperService:name0=StandaloneServer_port-1";
+    public void waitForServiceUp(long duration, TimeUnit units) {
+        super.waitForServiceUp(duration, units);
+
+        // Wait for the MBean to exist
+        JmxHelper helper = null;
+        try {
+            helper = new JmxHelper(this);
+            helper.connect();
+            helper.assertMBeanExistsEventually(zookeeperMbean, units.toMillis(duration));
+        } catch (IOException e) {
+            throw Exceptions.propagate(e);
+        } finally {
+            if (helper != null) helper.disconnect();
+        }
+    }
 
+    @Override
+    protected void connectSensors() {
         functionFeed = FunctionFeed.builder()
                 .entity(this)
                 .poll(new FunctionPollConfig<Object, Boolean>(SERVICE_UP)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/2ca3ea75/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
index cbfb410..89f5773 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/kafka/KafkaIntegrationTest.groovy
@@ -117,8 +117,6 @@ public class KafkaIntegrationTest {
 
         Entities.dumpInfo(cluster);
 
-        Thread.sleep(5000l);
-
         KafkaSupport support = new KafkaSupport(cluster.getZookeeper());
         support.sendMessage("brooklyn", "TEST_MESSAGE")
         List<String> messages = support.getMessage("brooklyn");


[37/50] brooklyn-library git commit: Merge pull request #673 from pveentjer/removecloudfoundry

Posted by he...@apache.org.
Merge pull request #673 from pveentjer/removecloudfoundry

Removed cloud foundry module since it is broken

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/4b5d145d
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/4b5d145d
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/4b5d145d

Branch: refs/heads/0.5.0
Commit: 4b5d145d77e9e3677632db463fa91427604a3558
Parents: d99e086 33dcec8
Author: Aled Sage <al...@gmail.com>
Authored: Mon Apr 22 03:00:12 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Apr 22 03:00:12 2013 -0700

----------------------------------------------------------------------
 examples/global-web-fabric/README.txt           |  11 +-
 .../brooklyn/demo/GlobalWebFabricExample.java   |  13 +-
 .../whirr/WebFabricWithHadoopExample.java       |  19 +--
 examples/pom.xml                                |   1 -
 examples/portable-cloudfoundry/.gitignore       |   2 -
 examples/portable-cloudfoundry/README.txt       |  14 --
 examples/portable-cloudfoundry/pom.xml          |  72 -----------
 .../MovableCloudFoundryClusterExample.java      |  37 ------
 .../MovableElasticWebAppCluster.java            |  58 ---------
 .../MovableElasticWebAppClusterImpl.groovy      | 127 -------------------
 .../cloudfoundry/MovableEntityTrait.java        |  21 ---
 .../src/main/resources/logback.xml              |   5 -
 12 files changed, 4 insertions(+), 376 deletions(-)
----------------------------------------------------------------------



[45/50] brooklyn-library git commit: Added more sensors from the `redis-cli info stats` command

Posted by he...@apache.org.
Added more sensors from the `redis-cli info stats` command


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/dc04ab27
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/dc04ab27
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/dc04ab27

Branch: refs/heads/0.5.0
Commit: dc04ab27150c392ee417af27134eb885269fb1e3
Parents: 657047f
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Apr 23 00:34:33 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 24 13:25:45 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisClusterImpl.java    | 15 +++-
 .../entity/nosql/redis/RedisShardImpl.java      |  4 +-
 .../entity/nosql/redis/RedisSlaveImpl.java      |  4 +-
 .../brooklyn/entity/nosql/redis/RedisStore.java |  8 +++
 .../entity/nosql/redis/RedisStoreDriver.java    |  3 +-
 .../entity/nosql/redis/RedisStoreImpl.java      | 73 +++++++++++++++-----
 .../entity/nosql/redis/RedisStoreSshDriver.java |  2 +-
 7 files changed, 81 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
index 6a5e6ff..eda1614 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisClusterImpl.java
@@ -23,13 +23,13 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
     public RedisClusterImpl() {
         this(MutableMap.of(), null);
     }
-    public RedisClusterImpl(Map properties) {
+    public RedisClusterImpl(Map<?, ?> properties) {
         this(properties, null);
     }
     public RedisClusterImpl(Entity parent) {
         this(MutableMap.of(), parent);
     }
-    public RedisClusterImpl(Map properties, Entity parent) {
+    public RedisClusterImpl(Map<?, ?> properties, Entity parent) {
         super(properties, parent);
     }
 
@@ -43,7 +43,7 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
                 .configure(DynamicCluster.MEMBER_SPEC, EntitySpecs.spec(RedisSlave.class).configure(RedisSlave.MASTER, master)));
         slaves.start(locations);
 
-        setAttribute(Startable.SERVICE_UP, true);
+        setAttribute(Startable.SERVICE_UP, calculateServiceUp());
     }
 
     @Override
@@ -58,4 +58,13 @@ public class RedisClusterImpl extends AbstractEntity implements RedisCluster {
     public void restart() {
         throw new UnsupportedOperationException();
     }
+
+    protected boolean calculateServiceUp() {
+        boolean up = false;
+        for (Entity member : slaves.getMembers()) {
+            if (Boolean.TRUE.equals(member.getAttribute(SERVICE_UP))) up = true;
+        }
+        return up;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
index 0eee09f..8b03903 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisShardImpl.java
@@ -10,13 +10,13 @@ public class RedisShardImpl extends AbstractEntity implements RedisShard {
     public RedisShardImpl() {
         this(MutableMap.of(), null);
     }
-    public RedisShardImpl(Map properties) {
+    public RedisShardImpl(Map<?, ?> properties) {
         this(properties, null);
     }
     public RedisShardImpl(Entity parent) {
         this(MutableMap.of(), parent);
     }
-    public RedisShardImpl(Map properties, Entity parent) {
+    public RedisShardImpl(Map<?, ?> properties, Entity parent) {
         super(properties, parent);
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
index c0718b9..e205fb2 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisSlaveImpl.java
@@ -15,13 +15,13 @@ public class RedisSlaveImpl extends RedisStoreImpl implements RedisSlave {
     public RedisSlaveImpl() {
         this(MutableMap.of(), null);
     }
-    public RedisSlaveImpl(Map properties) {
+    public RedisSlaveImpl(Map<?, ?> properties) {
         this(properties, null);
     }
     public RedisSlaveImpl(Entity parent) {
         this(MutableMap.of(), parent);
     }
-    public RedisSlaveImpl(Map properties, Entity parent) {
+    public RedisSlaveImpl(Map<?, ?> properties, Entity parent) {
         super(properties, parent);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
index 3717ffc..a972c5a 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStore.java
@@ -39,6 +39,14 @@ public interface RedisStore extends SoftwareProcess, DataStore {
 
     AttributeSensor<Integer> UPTIME = new BasicAttributeSensor<Integer>(Integer.class, "redis.uptime", "Redis uptime in seconds");
 
+    // See http://redis.io/commands/info for details of all information available
+    AttributeSensor<Integer> TOTAL_CONNECTIONS_RECEIVED = new BasicAttributeSensor<Integer>(Integer.class, "redis.connections.received.total", "Total number of connections accepted by the server");
+    AttributeSensor<Integer> TOTAL_COMMANDS_PROCESSED = new BasicAttributeSensor<Integer>(Integer.class, "redis.commands.processed.total", "Total number of commands processed by the server");
+    AttributeSensor<Integer> EXPIRED_KEYS = new BasicAttributeSensor<Integer>(Integer.class, "redis.keys.expired", "Total number of key expiration events");
+    AttributeSensor<Integer> EVICTED_KEYS = new BasicAttributeSensor<Integer>(Integer.class, "redis.keys.evicted", "Number of evicted keys due to maxmemory limit");
+    AttributeSensor<Integer> KEYSPACE_HITS = new BasicAttributeSensor<Integer>(Integer.class, "redis.keyspace.hits", "Number of successful lookup of keys in the main dictionary");
+    AttributeSensor<Integer> KEYSPACE_MISSES = new BasicAttributeSensor<Integer>(Integer.class, "redis.keyspace.misses", "Number of failed lookup of keys in the main dictionary");
+
     String getAddress();
 
     Integer getRedisPort();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreDriver.java
index c0d57b4..d8a1610 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreDriver.java
@@ -3,6 +3,7 @@ package brooklyn.entity.nosql.redis;
 import brooklyn.entity.basic.SoftwareProcessDriver;
 
 public interface RedisStoreDriver extends SoftwareProcessDriver {
-    
+
     String getRunDir();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
index ac8b5aa..a47c0ac 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreImpl.java
@@ -11,6 +11,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.basic.SoftwareProcessImpl;
 import brooklyn.event.feed.ssh.SshFeed;
 import brooklyn.event.feed.ssh.SshPollConfig;
+import brooklyn.event.feed.ssh.SshPollValue;
 import brooklyn.event.feed.ssh.SshValueFunctions;
 import brooklyn.location.Location;
 import brooklyn.location.MachineLocation;
@@ -26,8 +27,6 @@ import com.google.common.collect.Iterables;
 
 /**
  * An entity that represents a Redis key-value store service.
- *
- * TODO add sensors with Redis statistics using INFO command
  */
 public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
     protected static final Logger LOG = LoggerFactory.getLogger(RedisStore.class);
@@ -37,16 +36,16 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
     public RedisStoreImpl() {
         this(MutableMap.of(), null);
     }
-    public RedisStoreImpl(Map properties) {
+    public RedisStoreImpl(Map<?, ?> properties) {
         this(properties, null);
     }
     public RedisStoreImpl(Entity parent) {
         this(MutableMap.of(), parent);
     }
-    public RedisStoreImpl(Map properties, Entity parent) {
+    public RedisStoreImpl(Map<?, ?> properties, Entity parent) {
         super(properties, parent);
     }
-    
+
     @Override
     protected void connectSensors() {
         super.connectSensors();
@@ -57,29 +56,65 @@ public class RedisStoreImpl extends SoftwareProcessImpl implements RedisStore {
         Optional<Location> location = Iterables.tryFind(getLocations(), Predicates.instanceOf(SshMachineLocation.class));
         if (!location.isPresent()) throw new IllegalStateException("Could not find SshMachineLocation in list of locations");
         SshMachineLocation machine = (SshMachineLocation) location.get();
+        String statsCommand = getDriver().getRunDir() + "/bin/redis-cli info stats";
 
         sshFeed = SshFeed.builder()
                 .entity(this)
                 .machine(machine)
                 .poll(new SshPollConfig<Integer>(UPTIME)
-                        .command(getDriver().getRunDir() + "/bin/redis-cli info")
+                        .command(getDriver().getRunDir() + "/bin/redis-cli info server")
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("uptime_in_seconds")))
+                .poll(new SshPollConfig<Integer>(TOTAL_CONNECTIONS_RECEIVED)
+                        .command(statsCommand)
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("total_connections_received")))
+                .poll(new SshPollConfig<Integer>(TOTAL_COMMANDS_PROCESSED)
+                        .command(statsCommand)
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("total_commands_processed")))
+                .poll(new SshPollConfig<Integer>(EXPIRED_KEYS)
+                        .command(statsCommand)
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("expired_keys")))
+                .poll(new SshPollConfig<Integer>(EVICTED_KEYS)
+                        .command(statsCommand)
                         .onError(Functions.constant(-1))
-                        .onSuccess(Functions.compose(new Function<String, Integer>(){
-                            @Override
-                            public Integer apply(@Nullable String input) {
-                                Optional<String> line = Iterables.tryFind(Splitter.on('\n').split(input), Predicates.containsPattern("uptime_in_seconds:"));
-                                if (line.isPresent()) {
-                                    String data = line.get().trim();
-                                    int colon = data.indexOf(":");
-                                    return Integer.parseInt(data.substring(colon + 1));
-                                } else {
-                                    throw new IllegalStateException();
-                                }
-                            }
-                        }, SshValueFunctions.stdout())))
+                        .onSuccess(infoFunction("evicted_keys")))
+                .poll(new SshPollConfig<Integer>(KEYSPACE_HITS)
+                        .command(statsCommand)
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("keyspace_hits")))
+                .poll(new SshPollConfig<Integer>(KEYSPACE_MISSES)
+                        .command(statsCommand)
+                        .onError(Functions.constant(-1))
+                        .onSuccess(infoFunction("keyspace_misses")))
                 .build();
     }
 
+    /**
+     * Create a {@link Function} to retrieve a particular field value from a {@code redis-cli info}
+     * command.
+     * 
+     * @param field the info field to retrieve and convert
+     * @return a new function that converts a {@link SshPollValue} to an {@link Integer}
+     */
+    private static Function<SshPollValue, Integer> infoFunction(final String field) {
+        return Functions.compose(new Function<String, Integer>() {
+            @Override
+            public Integer apply(@Nullable String input) {
+                Optional<String> line = Iterables.tryFind(Splitter.on('\n').split(input), Predicates.containsPattern(field + ":"));
+                if (line.isPresent()) {
+                    String data = line.get().trim();
+                    int colon = data.indexOf(":");
+                    return Integer.parseInt(data.substring(colon + 1));
+                } else {
+                    throw new IllegalStateException("Data for field "+field+" not found: "+input);
+                }
+            }
+        }, SshValueFunctions.stdout());
+    }
+
     @Override
     public void disconnectSensors() {
         super.disconnectSensors();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/dc04ab27/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index 9b17057..16dc0d9 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -71,7 +71,7 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
                 .body.append("./bin/redis-server redis.conf")
                 .execute();
     }
- 
+
 
     @Override
     public boolean isRunning() {


[34/50] brooklyn-library git commit: Removal of all Cloud Foundry references in the code and in the poms

Posted by he...@apache.org.
Removal of all Cloud Foundry references in the code and in the poms


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/754897f6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/754897f6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/754897f6

Branch: refs/heads/0.5.0
Commit: 754897f674e1b65db9009b5fc354c5d15227b53d
Parents: 74e4016
Author: Peter Veentjer <al...@gmail.com>
Authored: Fri Apr 19 14:49:20 2013 +0300
Committer: Peter Veentjer <al...@gmail.com>
Committed: Fri Apr 19 14:49:20 2013 +0300

----------------------------------------------------------------------
 .../brooklyn/demo/GlobalWebFabricExample.java   |  13 +-
 .../whirr/WebFabricWithHadoopExample.java       |  19 +--
 examples/pom.xml                                |   1 -
 examples/portable-cloudfoundry/.gitignore       |   2 -
 examples/portable-cloudfoundry/README.txt       |  14 --
 examples/portable-cloudfoundry/pom.xml          |  72 -----------
 .../MovableCloudFoundryClusterExample.java      |  37 ------
 .../MovableElasticWebAppCluster.java            |  58 ---------
 .../MovableElasticWebAppClusterImpl.groovy      | 127 -------------------
 .../cloudfoundry/MovableEntityTrait.java        |  21 ---
 .../src/main/resources/logback.xml              |   5 -
 11 files changed, 3 insertions(+), 366 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
----------------------------------------------------------------------
diff --git a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
index 774affa..c6c92f9 100644
--- a/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
+++ b/examples/global-web-fabric/src/main/java/brooklyn/demo/GlobalWebFabricExample.java
@@ -10,15 +10,12 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.config.StringConfigMap;
 import brooklyn.entity.basic.AbstractApplication;
-import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.dns.geoscaling.GeoscalingDnsService;
 import brooklyn.entity.group.DynamicFabric;
 import brooklyn.entity.proxy.AbstractController;
 import brooklyn.entity.proxying.EntitySpecs;
 import brooklyn.entity.webapp.ElasticJavaWebAppService;
-import brooklyn.event.basic.DependentConfiguration;
-import brooklyn.extras.cloudfoundry.CloudFoundryJavaWebAppCluster;
 import brooklyn.launcher.BrooklynLauncher;
 import brooklyn.location.basic.PortRanges;
 import brooklyn.util.CommandLineUtil;
@@ -36,9 +33,7 @@ public class GlobalWebFabricExample extends AbstractApplication {
     static final List<String> DEFAULT_LOCATIONS = ImmutableList.of(
             "aws-ec2:eu-west-1",
             "aws-ec2:ap-southeast-1",
-            "aws-ec2:us-west-1" 
-//            "cloudfoundry:https://api.aws.af.cm/",
-        );
+            "aws-ec2:us-west-1" );
 
     @Override
     public void init() {
@@ -59,11 +54,7 @@ public class GlobalWebFabricExample extends AbstractApplication {
                 .configure(ElasticJavaWebAppService.ROOT_WAR, WAR_PATH)
                 
                 //load-balancer instances must run on 80 to work with GeoDNS (default is 8000)
-                .configure(AbstractController.PROXY_HTTP_PORT, PortRanges.fromInteger(80))
-                
-                //CloudFoundry requires to be told what URL it should listen to, which is chosen by the GeoDNS service
-                .configure(CloudFoundryJavaWebAppCluster.HOSTNAME_TO_USE_FOR_URL,
-                        DependentConfiguration.attributeWhenReady(geoDns, Attributes.HOSTNAME)));
+                .configure(AbstractController.PROXY_HTTP_PORT, PortRanges.fromInteger(80)));
 
         //tell GeoDNS what to monitor
         geoDns.setTargetEntityProvider(webFabric);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
----------------------------------------------------------------------
diff --git a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
index 11916a1..ab3e052 100644
--- a/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
+++ b/examples/hadoop-and-whirr/src/main/java/brooklyn/extras/whirr/WebFabricWithHadoopExample.java
@@ -3,7 +3,6 @@ package brooklyn.extras.whirr;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.File;
-import java.io.IOException;
 import java.io.StringReader;
 import java.net.InetAddress;
 import java.net.URI;
@@ -11,11 +10,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
 import org.apache.whirr.service.hadoop.HadoopCluster;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,7 +18,6 @@ import brooklyn.config.StringConfigMap;
 import brooklyn.entity.Entity;
 import brooklyn.entity.Group;
 import brooklyn.entity.basic.AbstractApplication;
-import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.DynamicGroup;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.StartableApplication;
@@ -37,10 +30,8 @@ import brooklyn.entity.webapp.ElasticJavaWebAppService;
 import brooklyn.entity.webapp.jboss.JBoss7Server;
 import brooklyn.event.SensorEvent;
 import brooklyn.event.SensorEventListener;
-import brooklyn.event.basic.DependentConfiguration;
 import brooklyn.event.feed.http.HttpPollValue;
 import brooklyn.event.feed.http.HttpPolls;
-import brooklyn.extras.cloudfoundry.CloudFoundryJavaWebAppCluster;
 import brooklyn.extras.whirr.hadoop.WhirrHadoopCluster;
 import brooklyn.launcher.BrooklynLauncher;
 import brooklyn.location.Location;
@@ -75,12 +66,7 @@ public class WebFabricWithHadoopExample extends AbstractApplication implements S
         //web locations
         "aws-ec2:eu-west-1",
         "aws-ec2:ap-southeast-1",
-        "aws-ec2:us-west-1"
-        
-        // cloudfoundry seems to have a timeout in upload time
-        // (in any case we don't have a clean way to initiate the proxy settings in there)
-//        "cloudfoundry:https://api.aws.af.cm/",
-    );
+        "aws-ec2:us-west-1");
 
     public static final String WAR_PATH = "classpath://hello-world-hadoop-webapp.war";
     
@@ -119,9 +105,6 @@ public class WebFabricWithHadoopExample extends AbstractApplication implements S
                 .configure(ElasticJavaWebAppService.ROOT_WAR, WAR_PATH)
                 //load-balancer instances must run on 80 to work with GeoDNS (default is 8000)
                 .configure(AbstractController.PROXY_HTTP_PORT, PortRanges.fromInteger(80))
-                //CloudFoundry requires to be told what URL it should listen to, which is chosen by the GeoDNS service
-                .configure(CloudFoundryJavaWebAppCluster.HOSTNAME_TO_USE_FOR_URL,
-                        DependentConfiguration.attributeWhenReady(geoDns, Attributes.HOSTNAME))
                 );
 //                .policy(AutoScalerPolicy.builder()
 //                        .metric(DynamicWebAppCluster.AVERAGE_REQUESTS_PER_SECOND)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index 3048876..bb82c5f 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -35,7 +35,6 @@
         <module>simple-web-cluster</module>
         <module>global-web-fabric</module>
         <module>hadoop-and-whirr</module>
-        <module>portable-cloudfoundry</module>
         <module>simple-messaging-pubsub</module>
         <module>simple-nosql-cluster</module>
     </modules>

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/.gitignore
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/.gitignore b/examples/portable-cloudfoundry/.gitignore
deleted file mode 100644
index 20738a7..0000000
--- a/examples/portable-cloudfoundry/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-brooklyn-example-portable-cloudfoundry/
-brooklyn-example-portable-cloudfoundry.tar.gz
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/README.txt
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/README.txt b/examples/portable-cloudfoundry/README.txt
deleted file mode 100644
index f2d49f0..0000000
--- a/examples/portable-cloudfoundry/README.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Instructions for running examples
-=================================
-
-The commands below assume that the `brooklyn` script is already on your $PATH, and you are in the "examples" directory:
-
-  cd portable-cloudfoundry
-  export BROOKLYN_CLASSPATH=$(pwd)/target/classes
-  
-  # Launches a web-app in VMware's cloudfoundry
-  brooklyn launch --app brooklyn.example.cloudfoundry.MovableCloudFoundryClusterExample --location localhost
-
----
-
-For more information, please visit: http://brooklyncentral.github.com/use/examples/portable-cloudfoundry/

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/pom.xml
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/pom.xml b/examples/portable-cloudfoundry/pom.xml
deleted file mode 100644
index 1dde430..0000000
--- a/examples/portable-cloudfoundry/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <packaging>jar</packaging>
-    <artifactId>brooklyn-example-portable-cloudfoundry</artifactId>
-    <name>Brooklyn Portable CloudFoundry Example</name>
-
-    <parent>
-        <groupId>io.brooklyn.example</groupId>
-        <artifactId>brooklyn-examples-parent</artifactId>
-        <version>0.5.0-SNAPSHOT</version>   <!-- BROOKLYN_VERSION -->
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>io.brooklyn</groupId>
-            <artifactId>brooklyn-all</artifactId>
-            <version>${project.version}</version>
-            <classifier>with-dependencies</classifier>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <!-- copy the WAR so it is available on the classpath for programmatic deployment -->
-                <executions>
-                    <execution>
-                        <id>copy</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <!-- this can fail in eclipse trying to copy _from_ target/classes.
-                                         see http://jira.codehaus.org/browse/MDEP-259 -->
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>brooklyn-example-hello-world-webapp</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>war</type>
-                                    <overWrite>true</overWrite>
-                                    <outputDirectory>target/classes</outputDirectory>
-                                    <destFileName>hello-world-webapp.war</destFileName>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-clean-plugin</artifactId>
-                <configuration>
-                    <filesets>
-                        <fileset>
-                            <directory>${project.basedir}</directory>
-							<includes>
-                                <include>${project.artifactId}/</include>
-                                <include>brooklyn*.log</include>
-                                <include>brooklyn*.log.*</include>
-                                <include>stacktrace.log</include>
-                            </includes>
-                        </fileset>
-                    </filesets>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-        
-</project>

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
deleted file mode 100644
index 3b30d1e..0000000
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableCloudFoundryClusterExample.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package brooklyn.example.cloudfoundry;
-
-import java.util.List;
-
-import brooklyn.entity.basic.AbstractApplication;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.proxying.EntitySpecs;
-import brooklyn.launcher.BrooklynLauncher;
-import brooklyn.util.CommandLineUtil;
-
-import com.google.common.collect.Lists;
-
-public class MovableCloudFoundryClusterExample extends AbstractApplication {
-
-    public static final String DEFAULT_LOCATION = "cloudfoundry";
-    public static final String WAR_FILE_URL = "classpath://hello-world-webapp.war";
-
-    @Override
-    public void init() {
-        addChild(EntitySpecs.spec(MovableElasticWebAppCluster.class)
-                .configure("war", WAR_FILE_URL));
-    }
-    
-    public static void main(String[] argv) {
-        List<String> args = Lists.newArrayList(argv);
-        String port =  CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
-        String location = CommandLineUtil.getCommandLineOption(args, "--location", DEFAULT_LOCATION);
-
-        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
-                .application(EntitySpecs.appSpec(MovableCloudFoundryClusterExample.class).displayName("Movable Web Cluster"))
-                .webconsolePort(port)
-                .location(location)
-                .start();
-         
-        Entities.dumpInfo(launcher.getApplications());
-    }
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
deleted file mode 100644
index 95d74fa..0000000
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppCluster.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package brooklyn.example.cloudfoundry;
-
-import java.util.Collection;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.Effector;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Description;
-import brooklyn.entity.basic.MethodEffector;
-import brooklyn.entity.basic.NamedParameter;
-import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.entity.trait.Startable;
-import brooklyn.entity.webapp.JavaWebAppService;
-import brooklyn.event.basic.BasicAttributeSensor;
-import brooklyn.event.basic.BasicConfigKey;
-import brooklyn.util.flags.SetFromFlag;
-
-@ImplementedBy(MovableElasticWebAppClusterImpl.class)
-public interface MovableElasticWebAppCluster extends Entity, Startable, MovableEntityTrait {
-
-    // this advertises that this config key is easily available on this entity,
-    // either by passing (war: "classpath://...") in the constructor or by setConfig(ROOT_WAR).
-    // as a config variable, it will be inherited by children, so the children web app entities will pick it up.
-    @SetFromFlag("war")
-    public static final ConfigKey<String> ROOT_WAR = JavaWebAppService.ROOT_WAR;
-    
-    @SetFromFlag("ttl")
-    public static final BasicConfigKey<Long> TIME_TO_LIVE_SECONDS = new BasicConfigKey<Long>(
-            Long.class, "movable.time.to.live", "Time to keep demoted cluster alive (should exceed GeoDNS TTL; default 0)", 0L);
-
-    public static final BasicAttributeSensor<String> PRIMARY_SVC_ENTITY_ID = new BasicAttributeSensor<String>(
-            String.class, "movable.primary.id", "Entity ID of primary web-app service");
-    
-    public static final BasicAttributeSensor<Collection<String>> SECONDARY_SVC_ENTITY_IDS = new BasicAttributeSensor( 
-            Collection.class, "movable.secondary.ids", "Entity IDs of secondary web-app services");
-    
-    public static final Effector<String> CREATE_SECONDARY_IN_LOCATION = new MethodEffector<String>(MovableElasticWebAppCluster.class, "createSecondaryInLocation");
-    public static final Effector<String> PROMOTE_SECONDARY = new MethodEffector<String>(MovableElasticWebAppCluster.class, "promoteSecondary");
-    public static final Effector<String> DESTROY_SECONDARY = new MethodEffector<String>(MovableElasticWebAppCluster.class, "destroySecondary");
-    
-    /** creates a new secondary instance, in the given location, returning the ID of the secondary created and started */
-    @Description("create a new secondary instance in the given location")
-    public String createSecondaryInLocation(
-            @NamedParameter("location") @Description("the location where to start the secondary") String l);
-
-    /** promotes the indicated secondary,
-     * returning the ID of the former-primary which has been demoted */
-    @Description("promote the indicated secondary to primary (demoting the existing primary)")
-    public String promoteSecondary(
-            @NamedParameter("idOfSecondaryToPromote") @Description("ID of secondary entity to promote") 
-            String idOfSecondaryToPromote);
-    
-    /** destroys the indicated secondary */
-    @Description("destroy the indicated secondary")
-    public void destroySecondary(
-            @NamedParameter("idOfSecondaryToDestroy") @Description("ID of secondary entity to destroy")
-            String idOfSecondaryToDestroy);
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppClusterImpl.groovy
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppClusterImpl.groovy b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppClusterImpl.groovy
deleted file mode 100644
index 599f0b8..0000000
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableElasticWebAppClusterImpl.groovy
+++ /dev/null
@@ -1,127 +0,0 @@
-package brooklyn.example.cloudfoundry
-
-import org.jclouds.cloudstack.options.AddClusterOptions;
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-import brooklyn.entity.Effector
-import brooklyn.entity.Entity
-import brooklyn.entity.basic.AbstractEntity
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.Entities
-import brooklyn.entity.basic.EntityLocal
-import brooklyn.entity.trait.Startable
-import brooklyn.entity.trait.StartableMethods
-import brooklyn.entity.webapp.ElasticJavaWebAppService
-import brooklyn.location.Location
-import brooklyn.location.basic.LocationRegistry
-import brooklyn.management.EntityManager
-import brooklyn.util.task.Tasks
-
-import com.google.common.collect.Iterables
-
-public class MovableElasticWebAppClusterImpl extends AbstractEntity implements MovableElasticWebAppCluster {
-
-    public static final Logger log = LoggerFactory.getLogger(MovableElasticWebAppClusterImpl.class);
-    
-    public MovableElasticWebAppClusterImpl() {
-    }
-    
-    /**
-     * @deprecated since 0.5; use {@link EntityManager#createEntity(EntitySpec) or {@link ApplicationBuilder#addChild(EntitySpec)}
-     */
-    @Deprecated
-    public MovableElasticWebAppClusterImpl(Map flags, Entity parent) {
-        super(flags, parent);
-    }
-    
-    @Override
-    public void start(Collection<? extends Location> locations) {
-        if (!getChildren().isEmpty()) {
-            log.debug("Starting $this; it already has children, so start on children is being invoked")
-            StartableMethods.start(this, locations);
-        } else {
-            Entity svc = createClusterIn( Iterables.getOnlyElement(locations) );
-            log.debug("Starting $this; no children, so created $svc and now starting it")
-            if (svc in Startable) ((Startable)svc).start(locations);
-            setAttribute(PRIMARY_SVC_ENTITY_ID, svc.id)
-        }
-    }
-
-    public EntityLocal createClusterIn(Location location) {
-        //TODO the policy
-//        app.web.cluster.addPolicy(app.policy)
-        EntityLocal result = new ElasticJavaWebAppService.Factory()
-                .newFactoryForLocation(location)
-                .newEntity([:], this);
-        Entities.manage(result);
-        return result;
-    }
-    
-    @Override
-    public void stop() {
-        StartableMethods.stop(this);
-    }
-
-    @Override
-    public void restart() {
-        StartableMethods.restart(this);
-    }
-
-    /* 
-     * "move" consists of creating a secondary (call it Y),
-     * promoting this one (Y) swapping it for the old-primary (call it X),
-     * then destroying the old-primary-now-secondary (X)
-     */
-
-    @Override
-    public String createSecondaryInLocation(String l) {
-        Location location = new LocationRegistry().resolve(l);
-        Entity svc = createClusterIn(location);
-        Entities.start(svc, [location]);
-        setAttribute(SECONDARY_SVC_ENTITY_IDS, (getAttribute(SECONDARY_SVC_ENTITY_IDS) ?: []) + svc.id);
-        return svc.id;
-    }
-
-    @Override
-    public String promoteSecondary(String idOfSecondaryToPromote) {
-        Collection<String> currentSecondaryIds = getAttribute(SECONDARY_SVC_ENTITY_IDS)
-        if (!currentSecondaryIds.contains(idOfSecondaryToPromote)) 
-            throw new IllegalStateException("Cannot promote unknown secondary $idOfSecondaryToPromote "+
-                "(available secondaries are $currentSecondaryIds)");
-            
-        String primaryId = getAttribute(PRIMARY_SVC_ENTITY_ID);
-        
-        setAttribute(PRIMARY_SVC_ENTITY_ID, idOfSecondaryToPromote);
-        currentSecondaryIds.remove(idOfSecondaryToPromote);
-        currentSecondaryIds << primaryId;
-        setAttribute(SECONDARY_SVC_ENTITY_IDS, currentSecondaryIds);
-        return primaryId;
-    }
-    
-    @Override
-    public void destroySecondary(String idOfSecondaryToDestroy) {
-        Collection<String> currentSecondaryIds = getAttribute(SECONDARY_SVC_ENTITY_IDS)
-        if (!currentSecondaryIds.contains(idOfSecondaryToDestroy))
-            throw new IllegalStateException("Cannot promote unknown secondary $idOfSecondaryToDestroy "+
-                "(available secondaries are $currentSecondaryIds)");
-            
-        currentSecondaryIds.remove(idOfSecondaryToDestroy);
-        setAttribute(SECONDARY_SVC_ENTITY_IDS, currentSecondaryIds);
-        
-        Entity secondary = getEntityManager().getEntity(idOfSecondaryToDestroy);
-        Entities.destroy(secondary);
-    }
-
-    @Override
-    public String move(String location) {
-        String newPrimary = createSecondaryInLocation(location);
-        String oldPrimary = promoteSecondary(newPrimary);
-        long ttl = getConfig(TIME_TO_LIVE_SECONDS);
-        if (ttl>0)
-            Tasks.withBlockingDetails("waiting for TTL to destroy old primary") { Thread.sleep(ttl*1000); }
-        destroySecondary(oldPrimary);
-        return newPrimary;
-    }
-        
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableEntityTrait.java
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableEntityTrait.java b/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableEntityTrait.java
deleted file mode 100644
index 5f5afe2..0000000
--- a/examples/portable-cloudfoundry/src/main/java/brooklyn/example/cloudfoundry/MovableEntityTrait.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package brooklyn.example.cloudfoundry;
-
-import brooklyn.entity.Effector;
-import brooklyn.entity.basic.Description;
-import brooklyn.entity.basic.MethodEffector;
-import brooklyn.entity.basic.NamedParameter;
-
-public interface MovableEntityTrait {
-
-    Effector<String> MOVE = new MethodEffector<String>(MovableEntityTrait.class, "move");
-    
-    /** Effectively move the entity to the new location.
-     * A new entity may be created (and the old destroyed) to effect this.
-     * @param location the new location where the entity should running
-     * @return the entity ID of the primary entity (after the move) in the specified location */
-    @Description("Effectively move the entity to the new location.")
-    public String move(
-        @NamedParameter("location") @Description("The new location where the entity should be running") 
-        String location);
-
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/754897f6/examples/portable-cloudfoundry/src/main/resources/logback.xml
----------------------------------------------------------------------
diff --git a/examples/portable-cloudfoundry/src/main/resources/logback.xml b/examples/portable-cloudfoundry/src/main/resources/logback.xml
deleted file mode 100644
index 25f3755..0000000
--- a/examples/portable-cloudfoundry/src/main/resources/logback.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<configuration>
-
-    <include resource="brooklyn/logback-default.xml"/>
-    
-</configuration>


[17/50] brooklyn-library git commit: Add jemalloc library to installed packages for Redis

Posted by he...@apache.org.
Add jemalloc library to installed packages for Redis


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/49d15bb5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/49d15bb5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/49d15bb5

Branch: refs/heads/0.5.0
Commit: 49d15bb588fab02f0794f00c3a01434502457fad
Parents: 32a6eba
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Apr 10 15:27:39 2013 +0100
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Apr 10 15:28:33 2013 +0100

----------------------------------------------------------------------
 .../entity/nosql/redis/RedisStoreSshDriver.java    | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/49d15bb5/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
index b3b4b23..6efccdb 100644
--- a/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
+++ b/software/nosql/src/main/java/brooklyn/entity/nosql/redis/RedisStoreSshDriver.java
@@ -45,25 +45,10 @@ public class RedisStoreSshDriver extends AbstractSoftwareProcessSshDriver implem
         String saveAs = resolver.getFilename();
         expandedInstallDir = getInstallDir()+"/"+resolver.getUnpackedDirectoryName(format("redis-%s", getVersion()));
 
-        /*
-         * FIXME On jenkins releng3 box, needed to explicitly install jemalloc:
-         *   wget http://www.canonware.com/download/jemalloc/jemalloc-3.3.0.tar.bz2
-         *   tar -xvjpf jemalloc-3.3.0.tar.bz2 
-         *   cd jemalloc-3.3.0
-         *   ./configure
-         *   make
-         *   sudo make install
-         *   cd ..
-         *   
-         *   cd redis-2.6.7
-         *   make distclean
-         *   cd deps; make hiredis lua jemalloc linenoise; cd ..
-         *   "make LDFLAGS="-all-static"
-         */
-
         List<String> commands = ImmutableList.<String>builder()
                 .addAll(CommonCommands.downloadUrlAs(urls, saveAs))
                 .add(CommonCommands.INSTALL_TAR)
+                .add(CommonCommands.installPackage(MutableMap.of("apt", "libjemalloc-dev", "yum", "jemalloc-devel", "port", null, "brew", null), null))
                 .add("tar xzfv " + saveAs)
                 .add(format("cd redis-%s", getVersion()))
                 .add("make distclean")


[10/50] brooklyn-library git commit: Override AbstractApplication.init()

Posted by he...@apache.org.
Override AbstractApplication.init()

- AbstractApplication.init() logs warning that the method will be
  most likely be deprecated in a future release.
- Override init() in sub-classes.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/23a5c988
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/23a5c988
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/23a5c988

Branch: refs/heads/0.5.0
Commit: 23a5c988559482705aaacc795eb7e325cabea19c
Parents: 3c0588c
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 14:52:48 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Mar 29 09:37:57 2013 +0000

----------------------------------------------------------------------
 .../main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java | 4 ----
 .../java/brooklyn/web/console/test/TestApplication.groovy     | 5 +++++
 .../src/test/java/brooklyn/entity/webapp/JBossExample.groovy  | 7 ++++++-
 3 files changed, 11 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/23a5c988/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
----------------------------------------------------------------------
diff --git a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
index 898a410..df88bb9 100644
--- a/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
+++ b/examples/simple-web-cluster/src/main/java/brooklyn/demo/WebClusterDatabaseExampleApp.java
@@ -17,7 +17,6 @@ import brooklyn.enricher.basic.SensorPropagatingEnricher;
 import brooklyn.enricher.basic.SensorTransformingEnricher;
 import brooklyn.entity.basic.AbstractApplication;
 import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityLocal;
 import brooklyn.entity.basic.StartableApplication;
 import brooklyn.entity.database.mysql.MySqlNode;
 import brooklyn.entity.group.DynamicCluster;
@@ -35,7 +34,6 @@ import brooklyn.launcher.BrooklynLauncher;
 import brooklyn.location.basic.PortRanges;
 import brooklyn.policy.autoscaling.AutoScalerPolicy;
 import brooklyn.util.CommandLineUtil;
-import brooklyn.util.text.StringFunctions;
 
 import com.google.common.base.Functions;
 import com.google.common.collect.Lists;
@@ -91,8 +89,6 @@ public class WebClusterDatabaseExampleApp extends AbstractApplication implements
 
     @Override
     public void init() {
-        super.init();
-
         MySqlNode mysql = addChild(
                 EntitySpecs.spec(MySqlNode.class)
                         .configure(MySqlNode.CREATION_SCRIPT_URL, getConfig(DB_SETUP_SQL_URL)));

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/23a5c988/sandbox/web-acceptance/src/test/java/brooklyn/web/console/test/TestApplication.groovy
----------------------------------------------------------------------
diff --git a/sandbox/web-acceptance/src/test/java/brooklyn/web/console/test/TestApplication.groovy b/sandbox/web-acceptance/src/test/java/brooklyn/web/console/test/TestApplication.groovy
index 08285ff..046756b 100644
--- a/sandbox/web-acceptance/src/test/java/brooklyn/web/console/test/TestApplication.groovy
+++ b/sandbox/web-acceptance/src/test/java/brooklyn/web/console/test/TestApplication.groovy
@@ -60,6 +60,11 @@ class TestApplication extends AbstractApplication {
         setAttribute(CHILDREN, getChildren().size())
     }
 
+    @Override
+    public void init() {
+        // no-op
+    }
+
     public <T> Task<T> invoke(Effector<T> eff, Map<String, ?> parameters) {
         return null  //To change body of implemented methods use File | Settings | File Templates.
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/23a5c988/software/webapp/src/test/java/brooklyn/entity/webapp/JBossExample.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/JBossExample.groovy b/software/webapp/src/test/java/brooklyn/entity/webapp/JBossExample.groovy
index 2b4dc4e..253463c 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/JBossExample.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/JBossExample.groovy
@@ -14,8 +14,13 @@ import brooklyn.location.basic.LocalhostMachineProvisioningLocation
 @Deprecated
 class JBossExample extends AbstractApplication {
 
-    JBoss7Server s = new JBoss7ServerImpl(this, httpPort: "8080+", war:"classpath://hello-world.war");
+    JBoss7Server s;
     
+    @Override
+    public void init() {
+        s = new JBoss7ServerImpl(this, httpPort: "8080+", war:"classpath://hello-world.war");
+    }
+
     public static void main(String[] args) {
         def ex = new JBossExample();
         ex.start( [ new LocalhostMachineProvisioningLocation(name:'london') ] )


[19/50] brooklyn-library git commit: Merge pull request #659 from aledsage/cherrypick/AbstractController-memento-fix

Posted by he...@apache.org.
Merge pull request #659 from aledsage/cherrypick/AbstractController-memento-fix

Fix memento/rebind of AbstractController (0.5)

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/74e40168
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/74e40168
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/74e40168

Branch: refs/heads/0.5.0
Commit: 74e401681d544ff942b7bfc151c03c0b2c37c586
Parents: 227e33d 4181d27
Author: Peter Veentjer <al...@gmail.com>
Authored: Wed Apr 10 23:56:19 2013 -0700
Committer: Peter Veentjer <al...@gmail.com>
Committed: Wed Apr 10 23:56:19 2013 -0700

----------------------------------------------------------------------
 .../main/java/brooklyn/entity/proxy/AbstractControllerImpl.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[15/50] brooklyn-library git commit: Fix memento/rebind of AbstractController

Posted by he...@apache.org.
Fix memento/rebind of AbstractController

- serverPoolTargets has entities as keys, so needed to fix
  MementoTransformer.transformIdsToEntities so it converted
  keys and values correctly.
- Can revisit this in the future for instead using serialised
  form of an entity-ref, rather than just String perhaps.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/4181d279
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/4181d279
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/4181d279

Branch: refs/heads/0.5.0
Commit: 4181d279daa424b5fb873518aa8717f2274c78b7
Parents: 32a6eba
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 10 13:01:17 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Apr 10 14:34:36 2013 +0100

----------------------------------------------------------------------
 .../main/java/brooklyn/entity/proxy/AbstractControllerImpl.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/4181d279/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
index 86f80ab..4585013 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
@@ -33,6 +33,7 @@ import com.google.common.base.Function;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.net.HostAndPort;
+import com.google.common.reflect.TypeToken;
 
 /**
  * Represents a controller mechanism for a {@link Cluster}.
@@ -359,7 +360,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
             	// TODO If pool-target entity couldn't be resolved, then  serverPoolAddresses and serverPoolTargets
             	// will be out-of-sync (for ever more?)
             	serverPoolAddresses.addAll((Collection<String>) memento.getCustomField("serverPoolAddresses"));
-				serverPoolTargets.putAll(MementoTransformer.transformIdsToEntities(rebindContext, memento.getCustomField("serverPoolTargets"), Map.class, true));
+				serverPoolTargets.putAll(MementoTransformer.transformIdsToEntities(rebindContext, memento.getCustomField("serverPoolTargets"), new TypeToken<Map<Entity,String>>() {}, true));
             }
         };
     }


[06/50] brooklyn-library git commit: Merge pull request #629 from aledsage/fix/groovy-to-java

Posted by he...@apache.org.
Merge pull request #629 from aledsage/fix/groovy-to-java

convert groovy to java

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/ca73363f
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/ca73363f
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/ca73363f

Branch: refs/heads/0.5.0
Commit: ca73363f60e8fd72b0e4312fed81e50a4a1aa596
Parents: 3d9e3cc 09491e0
Author: Aled Sage <al...@gmail.com>
Authored: Wed Mar 27 05:16:56 2013 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Mar 27 05:16:56 2013 -0700

----------------------------------------------------------------------
 .../MovableElasticWebAppCluster.java            |   3 +-
 .../java/brooklyn/entity/messaging/Topic.groovy |  28 --
 .../java/brooklyn/entity/messaging/Topic.java   |  28 ++
 .../entity/messaging/amqp/AmqpExchange.groovy   |  23 --
 .../entity/messaging/amqp/AmqpExchange.java     |  24 ++
 .../entity/messaging/amqp/AmqpServer.groovy     |  34 ---
 .../entity/messaging/amqp/AmqpServer.java       |  34 +++
 .../entity/dns/AbstractGeoDnsService.java       |  12 +-
 .../entity/dns/AbstractGeoDnsServiceImpl.groovy | 237 -----------------
 .../entity/dns/AbstractGeoDnsServiceImpl.java   | 253 +++++++++++++++++++
 .../geoscaling/GeoscalingDnsServiceImpl.groovy  | 150 -----------
 .../geoscaling/GeoscalingDnsServiceImpl.java    | 168 ++++++++++++
 .../brooklyn/entity/proxy/ProxySslConfig.groovy |  78 ------
 .../brooklyn/entity/proxy/ProxySslConfig.java   | 128 ++++++++++
 .../webapp/DynamicWebAppClusterImpl.groovy      |  78 ------
 .../entity/webapp/DynamicWebAppClusterImpl.java | 107 ++++++++
 .../entity/webapp/JavaWebAppService.groovy      |  19 --
 .../entity/webapp/JavaWebAppService.java        |  24 ++
 18 files changed, 774 insertions(+), 654 deletions(-)
----------------------------------------------------------------------



[14/50] brooklyn-library git commit: Deletes ApplicationBuilder.Builder

Posted by he...@apache.org.
Deletes ApplicationBuilder.Builder

- Removes the Builder
- Adds ApplicationBuilder.newManagedApp(...) for use
  by tests.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/576b649c
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/576b649c
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/576b649c

Branch: refs/heads/0.5.0
Commit: 576b649cdea5dc5d26edbe6759da1aea47d0d753
Parents: 8990ab7
Author: Aled Sage <al...@gmail.com>
Authored: Thu Mar 28 16:12:39 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Apr 1 12:41:41 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy     | 2 +-
 .../entity/database/postgresql/PostgreSqlIntegrationTest.groovy    | 2 +-
 .../brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java   | 2 +-
 .../entity/messaging/activemq/ActiveMQIntegrationTest.groovy       | 2 +-
 .../java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy | 2 +-
 .../brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy  | 2 +-
 .../brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java | 2 +-
 .../brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java  | 2 +-
 .../brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java     | 2 +-
 .../java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java | 2 +-
 .../src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java   | 2 +-
 .../test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy | 2 +-
 .../test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy | 2 +-
 .../entity/dns/geoscaling/GeoscalingIntegrationTest.groovy         | 2 +-
 .../webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java | 2 +-
 .../brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java   | 2 +-
 .../entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy         | 2 +-
 .../java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy   | 2 +-
 .../brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java     | 2 +-
 .../brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java    | 2 +-
 .../entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy       | 2 +-
 .../brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy  | 2 +-
 .../brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java | 2 +-
 .../java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy    | 2 +-
 .../test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java  | 2 +-
 .../webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java    | 2 +-
 .../brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java  | 2 +-
 .../entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java     | 2 +-
 .../brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java | 2 +-
 29 files changed, 29 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy b/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy
index e3d8f2d..30829c9 100644
--- a/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy
+++ b/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlIntegrationTest.groovy
@@ -28,7 +28,7 @@ public class MySqlIntegrationTest {
 
     @BeforeMethod(alwaysRun = true)
     public void before() {
-        tapp = ApplicationBuilder.builder(TestApplication.class).manage();
+        tapp = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/database/src/test/java/brooklyn/entity/database/postgresql/PostgreSqlIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/database/src/test/java/brooklyn/entity/database/postgresql/PostgreSqlIntegrationTest.groovy b/software/database/src/test/java/brooklyn/entity/database/postgresql/PostgreSqlIntegrationTest.groovy
index 2f5ed6b..2fc9949 100644
--- a/software/database/src/test/java/brooklyn/entity/database/postgresql/PostgreSqlIntegrationTest.groovy
+++ b/software/database/src/test/java/brooklyn/entity/database/postgresql/PostgreSqlIntegrationTest.groovy
@@ -25,7 +25,7 @@ public class PostgreSqlIntegrationTest {
 
     @BeforeMethod(alwaysRun = true)
     public void before() {
-        tapp = ApplicationBuilder.builder(TestApplication.class).manage();
+        tapp = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun = true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/database/src/test/java/brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/database/src/test/java/brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java b/software/database/src/test/java/brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java
index 71d90bc..8e8e305 100644
--- a/software/database/src/test/java/brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java
+++ b/software/database/src/test/java/brooklyn/entity/database/rubyrep/RubyRepIntegrationTest.java
@@ -31,7 +31,7 @@ public class RubyRepIntegrationTest {
 
     @BeforeMethod(alwaysRun = true)
     public void setUp() {
-        tapp = ApplicationBuilder.builder(TestApplication.class).manage();
+        tapp = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun = true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
index d41b9c0..f50de0c 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/activemq/ActiveMQIntegrationTest.groovy
@@ -43,7 +43,7 @@ public class ActiveMQIntegrationTest {
 
     @BeforeMethod(groups = "Integration")
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation()
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/messaging/src/test/java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy
index a4ea657..55e6673 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/qpid/QpidIntegrationTest.groovy
@@ -45,7 +45,7 @@ public class QpidIntegrationTest {
     public void setup() {
         String workingDir = System.getProperty("user.dir");
         println workingDir
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation()
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy b/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
index b41a82a..94aeb0f 100644
--- a/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
+++ b/software/messaging/src/test/java/brooklyn/entity/messaging/rabbit/RabbitIntegrationTest.groovy
@@ -54,7 +54,7 @@ public class RabbitIntegrationTest {
 
     @BeforeMethod(groups = "Integration")
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation()
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java
index 1e6b12f..0d9adc9 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/AbstractCassandraNodeTest.java
@@ -32,7 +32,7 @@ public class AbstractCassandraNodeTest {
 
     @BeforeMethod(alwaysRun = true)
     public void setup() throws Exception {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation();
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java
index c0f9f85..22fbc51 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/cassandra/CassandraClusterLiveTest.java
@@ -46,7 +46,7 @@ class CassandraClusterLiveTest {
 
     @BeforeMethod(alwaysRun = true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = app.getManagementContext().getLocationRegistry().resolve(provider);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java
index 7c14ba1..4509881 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/AbstractCouchDBNodeTest.java
@@ -44,7 +44,7 @@ public class AbstractCouchDBNodeTest {
 
     @BeforeMethod(alwaysRun = true)
     public void setup() throws Exception {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = new LocalhostMachineProvisioningLocation();
         // testLocation = app.managementContext.locationRegistry.resolve("named:test");
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java
index ce6d694..eee4caa 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/couchdb/CouchDBClusterLiveTest.java
@@ -58,7 +58,7 @@ class CouchDBClusterLiveTest {
 
     @BeforeMethod(alwaysRun = true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         testLocation = app.getManagementContext().getLocationRegistry().resolve(provider);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/nosql/src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java
----------------------------------------------------------------------
diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java
index 4d2a4c0..3ab7aaf 100644
--- a/software/nosql/src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java
+++ b/software/nosql/src/test/java/brooklyn/entity/nosql/mongodb/MongoDbTest.java
@@ -35,7 +35,7 @@ public class MongoDbTest {
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
     	localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
----------------------------------------------------------------------
diff --git a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
index a30e699..e06440c 100644
--- a/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
+++ b/software/osgi/src/test/java/brooklyn/entity/osgi/karaf/KarafContainerTest.groovy
@@ -29,7 +29,7 @@ public class KarafContainerTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
index f71322e..bba6b3b 100644
--- a/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/dns/AbstractGeoDnsServiceTest.groovy
@@ -63,7 +63,7 @@ public class AbstractGeoDnsServiceTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         fabric = app.createAndManageChild(EntitySpecs.spec(DynamicFabric.class)
             .configure("factory", { properties -> new TestEntityImpl(properties) }));
         

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
index 750db2e..bae975f 100644
--- a/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/dns/geoscaling/GeoscalingIntegrationTest.groovy
@@ -36,7 +36,7 @@ class GeoscalingIntegrationTest {
     
     @Test(groups=["Integration"])
     public void testRoutesToExpectedLocation() {
-        TestApplication app = ApplicationBuilder.builder(TestApplication.class).manage();
+        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
         TestEntity target = app.createAndManageChild(EntitySpecs.spec(TestEntity.class));
         target.setAttribute(Attributes.HOSTNAME,addr.getHostName())
         

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java
index ef856fd..85ed58d 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/UrlMappingTest.java
@@ -49,7 +49,7 @@ public class UrlMappingTest {
         mementoDir = Files.createTempDir();
         managementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader);
 
-        app = ApplicationBuilder.builder(TestApplication.class).manage(managementContext);
+        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
         
         EntityFactory<StubAppServer> serverFactory = new BasicConfigurableEntityFactory<StubAppServer>(StubAppServer.class);
         cluster = app.createAndManageChild(EntitySpecs.spec(DynamicCluster.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java
index 17c0aa8..bad05f2 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxClusterIntegrationTest.java
@@ -62,7 +62,7 @@ public class NginxClusterIntegrationTest {
         war = checkNotNull(getClass().getClassLoader().getResource("hello-world.war"), "hello-world.war not on classpath");
         localhostProvisioningLoc = new LocalhostMachineProvisioningLocation(MutableMap.of("address", "localhost"));
         
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         urlMappings = app.createAndManageChild(EntitySpecs.spec(BasicGroup.class)
                 .configure("childrenAsMembers", true));
         entityManager = app.getManagementContext().getEntityManager();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy
index cd6d5a2..0265f52 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.groovy
@@ -42,7 +42,7 @@ public class NginxHttpsSslIntegrationTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy
index 4ea4fe0..282b7dc 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxIntegrationTest.groovy
@@ -39,7 +39,7 @@ public class NginxIntegrationTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/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
index 2916205..5b87e12 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxLightIntegrationTest.java
@@ -39,7 +39,7 @@ public class NginxLightIntegrationTest {
     
     @BeforeMethod
     public void setup() {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
 
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/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
index ad11bdf..05d6577 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxRebindIntegrationTest.java
@@ -65,7 +65,7 @@ public class NginxRebindIntegrationTest {
 
         mementoDir = Files.createTempDir();
         origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader);
-        origApp = ApplicationBuilder.builder(TestApplication.class).manage(origManagementContext);
+        origApp = ApplicationBuilder.newManagedApp(TestApplication.class, origManagementContext);
 
     	localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy
index ca910f7..3bc2804 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxUrlMappingIntegrationTest.groovy
@@ -58,7 +58,7 @@ public class NginxUrlMappingIntegrationTest {
         war = getClass().getClassLoader().getResource("hello-world.war")
         assertNotNull(war, "Unable to locate hello-world.war resource");
         
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         urlMappingsGroup = app.createAndManageChild(EntitySpecs.spec(BasicGroup.class)
                 .configure("childrenAsMembers", true));
         entityManager = app.getManagementContext().getEntityManager();

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy
index ab87cbd..da48c8f 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.groovy
@@ -44,7 +44,7 @@ public class NginxWebClusterEc2LiveTest {
                 ImmutableMap.of("brooklyn.location.jclouds.aws-ec2.image-id", "us-east-1/ami-2342a94a"));
         
         loc = managementContext.getLocationRegistry().resolve("aws-ec2:us-east-1")
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         Entities.startManagement(app, managementContext)
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/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 ca36302..1af049d 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java
@@ -48,7 +48,7 @@ public class ControlledDynamicWebAppClusterTest {
         String warPath = "hello-world.war";
         warUrl = getClass().getClassLoader().getResource(warPath);
         
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         loc = new LocalhostMachineProvisioningLocation();
         locs = ImmutableList.of(loc);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy
index 374ad74..2bcb46e 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.groovy
@@ -38,7 +38,7 @@ public class DynamicWebAppClusterTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
     }
     
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
index 1f7cc8d..93eb96d 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
@@ -39,7 +39,7 @@ public class DynamicWebAppFabricTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         loc1 = new SimulatedLocation();
         loc2 = new SimulatedLocation();
         locs = ImmutableList.of(loc1, loc2);

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java
index 84f82c5..4b13d26 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/DynamicWebAppClusterRebindIntegrationTest.java
@@ -63,7 +63,7 @@ public class DynamicWebAppClusterRebindIntegrationTest {
         origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader);
 
     	localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
-    	origApp = ApplicationBuilder.builder(TestApplication.class).manage(origManagementContext);
+    	origApp = ApplicationBuilder.newManagedApp(TestApplication.class, origManagementContext);
     }
 
     @AfterMethod(groups = "Integration", alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
index 465d887..6634198 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
@@ -49,7 +49,7 @@ public class Jboss7ServerIntegrationTest {
         warUrl = getClass().getClassLoader().getResource(warPath);
 
     	localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
-        app = ApplicationBuilder.builder(TestApplication.class).manage();
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
         keystoreFile = createTemporaryKeyStore("myname", "mypass");
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java
index 786a41b..64834ea 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerRebindIntegrationTest.java
@@ -62,7 +62,7 @@ public class Jboss7ServerRebindIntegrationTest {
         origManagementContext = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader);
 
     	localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
-        origApp = ApplicationBuilder.builder(TestApplication.class).manage(origManagementContext);
+        origApp = ApplicationBuilder.newManagedApp(TestApplication.class, origManagementContext);
     }
 
     @AfterMethod(groups = "Integration", alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/576b649c/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java
index 48793fe..9a06f1c 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerIntegrationTest.java
@@ -55,7 +55,7 @@ public class TomcatServerIntegrationTest {
     public void detectFailureIfTomcatCantBindToPort() throws Exception {
         ServerSocket listener = new ServerSocket(DEFAULT_HTTP_PORT);
         try {
-            app = ApplicationBuilder.builder(TestApplication.class).manage();
+            app = ApplicationBuilder.newManagedApp(TestApplication.class);
             tc = app.createAndManageChild(EntitySpecs.spec(TomcatServer.class).configure("httpPort",DEFAULT_HTTP_PORT));
             
             try {


[35/50] brooklyn-library git commit: Removed most of the cloud foundry stuff from the docs

Posted by he...@apache.org.
Removed most of the cloud foundry stuff from the docs


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/33dcec81
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/33dcec81
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/33dcec81

Branch: refs/heads/0.5.0
Commit: 33dcec810de9b77959b356aab671b4568c6adedb
Parents: 754897f
Author: Peter Veentjer <al...@gmail.com>
Authored: Fri Apr 19 14:59:45 2013 +0300
Committer: Peter Veentjer <al...@gmail.com>
Committed: Fri Apr 19 14:59:45 2013 +0300

----------------------------------------------------------------------
 examples/global-web-fabric/README.txt | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/33dcec81/examples/global-web-fabric/README.txt
----------------------------------------------------------------------
diff --git a/examples/global-web-fabric/README.txt b/examples/global-web-fabric/README.txt
index 700145c..f2e017e 100644
--- a/examples/global-web-fabric/README.txt
+++ b/examples/global-web-fabric/README.txt
@@ -9,9 +9,6 @@ and you are in this directory.  Adjust to taste for other configurations.
   # Launch the app in aws-ec2 regions eu-west-1 and us-east-1
   brooklyn launch --app brooklyn.demo.GlobalWebFabricExample --location "aws-ec2:eu-west-1,aws-ec2:us-east-1"
 
-  # Launch the app in aws-ec2 regions eu-west-1 and us-east-1, and use an AppFog cloudfoundry account in AWS US-West
-  brooklyn launch --app brooklyn.demo.GlobalWebFabricExample --location "aws-ec2:eu-west-1,aws-ec2:us-east-1,cloudfoundry:https://api.aws.af.cm/"
-
 ---
 
 The aws-ec2 credentials are retrieved from ~/.brooklyn/brooklyn.properties
@@ -20,10 +17,4 @@ This file should contain something like:
   brooklyn.jclouds.aws-ec2.identity=AKA50M30N3S1DFR0MAW55
   brooklyn.jclouds.aws-ec2.credential=aT0Ps3cr3tC0D3wh1chAW5w1llG1V3y0uTOus333
 
-Brooklyn defaults to using ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub.
-
-For Cloud Foundry you must have an AppFog account set up and the CloudFoundry client configured and on the path.
-
----
-
-For more information, please visit: http://brooklyncentral.github.com/use/examples/global-web-fabric/
+Brooklyn defaults to using ~/.ssh/id_rsa and ~/.ssh/id_rsa.pub.
\ No newline at end of file


[48/50] brooklyn-library git commit: Fix MySqlLiveRackspaceTest

Posted by he...@apache.org.
Fix MySqlLiveRackspaceTest

- brooklynProps.put should take string values, rather than
  a list.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-library/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-library/commit/0d9ee800
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-library/tree/0d9ee800
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-library/diff/0d9ee800

Branch: refs/heads/0.5.0
Commit: 0d9ee800f7864c475ce80218c9d481978c329202
Parents: 8d1b5d2
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 17 14:40:16 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 25 11:24:43 2013 +0100

----------------------------------------------------------------------
 .../brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-library/blob/0d9ee800/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy
----------------------------------------------------------------------
diff --git a/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy b/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy
index f1a374e..e8b1598 100644
--- a/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy
+++ b/software/database/src/test/java/brooklyn/entity/database/mysql/MySqlLiveRackspaceTest.groovy
@@ -72,7 +72,7 @@ public class MySqlLiveRackspaceTest extends MySqlIntegrationTest {
         BrooklynProperties brooklynProperties = BrooklynProperties.Factory.newDefault();
         brooklynProperties.put("brooklyn.jclouds.cloudservers-uk.image-name-regex", osRegex);
         brooklynProperties.remove("brooklyn.jclouds.cloudservers-uk.image-id");
-        brooklynProperties.put("inboundPorts", [22, 3306]);
+        brooklynProperties.put("inboundPorts", "22, 3306");
         LocationRegistry locationRegistry = new LocationRegistry(brooklynProperties);
 
         JcloudsLocation jcloudsLocation = (JcloudsLocation) locationRegistry.resolve("cloudservers-uk");