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:49:05 UTC

[01/50] brooklyn-server git commit: Added version-specific dependency for jclouds-enterprise (required by whirr)

Repository: brooklyn-server
Updated Branches:
  refs/heads/0.6.0 [created] fcc389844


Added version-specific dependency for jclouds-enterprise (required by whirr)


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

Branch: refs/heads/0.6.0
Commit: 5943d2d5d762ee83e06f2e3322f3491be34612df
Parents: 89f1eee
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Nov 1 14:44:20 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Nov 1 14:44:20 2013 +0000

----------------------------------------------------------------------
 systems/whirr/base/pom.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5943d2d5/systems/whirr/base/pom.xml
----------------------------------------------------------------------
diff --git a/systems/whirr/base/pom.xml b/systems/whirr/base/pom.xml
index 12047bb..9e51283 100644
--- a/systems/whirr/base/pom.xml
+++ b/systems/whirr/base/pom.xml
@@ -100,6 +100,11 @@
             <artifactId>jclouds-netty</artifactId>
             <version>${jclouds.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.driver</groupId>
+            <artifactId>jclouds-enterprise</artifactId>
+            <version>${jclouds.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.whirr</groupId>


[22/50] brooklyn-server git commit: Fix JcloudsLocation rebindMachine to work like obtainOnce with ConfigBag.newInstanceExtending

Posted by he...@apache.org.
Fix JcloudsLocation rebindMachine to work like obtainOnce with ConfigBag.newInstanceExtending


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

Branch: refs/heads/0.6.0
Commit: 224fca673cb2bb8933baabbf3afc6f30e1704830
Parents: 9458604
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Nov 12 18:37:44 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Tue Nov 12 18:37:44 2013 +0000

----------------------------------------------------------------------
 .../main/java/brooklyn/location/jclouds/JcloudsLocation.java | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/224fca67/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 77389b0..636f825 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -375,7 +375,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         if (attempts == null || attempts < 1) attempts = 1;
         for (int i = 1; i <= attempts; i++) {
             try {
-                return obtainOnce(flags, setup);
+                return obtainOnce(setup);
             } catch (RuntimeException e) {
                 LOG.warn("Attempt #{}/{} to obtain machine threw error: {}", new Object[]{i, attempts, e});
                 exceptions.add(e);
@@ -394,7 +394,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         }
     }
 
-    protected JcloudsSshMachineLocation obtainOnce(Map<?, ?> flags, ConfigBag setup) throws NoMachinesAvailableException {
+    protected JcloudsSshMachineLocation obtainOnce(ConfigBag setup) throws NoMachinesAvailableException {
         AccessController.Response access = getManagementContext().getAccessController().canProvisionLocation(this);
         if (!access.isAllowed()) {
             throw new IllegalStateException("Access controller forbids provisioning in "+this+": "+access.getMsg());
@@ -1056,8 +1056,10 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
             throw Exceptions.propagate(e);
         }
     }
+
     public JcloudsSshMachineLocation rebindMachine(Map flags) throws NoMachinesAvailableException {
-        return rebindMachine(new ConfigBag().putAll(flags));
+        ConfigBag setup = ConfigBag.newInstanceExtending(getConfigBag(), flags);
+        return rebindMachine(setup);
     }
 
     // -------------- create the SshMachineLocation instance, and connect to it etc ------------------------


[42/50] brooklyn-server git commit: remove deprecation from ResourceUtils, as per https://github.com/brooklyncentral/brooklyn/pull/988#issuecomment-28402564

Posted by he...@apache.org.
remove deprecation from ResourceUtils, as per https://github.com/brooklyncentral/brooklyn/pull/988#issuecomment-28402564


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

Branch: refs/heads/0.6.0
Commit: 3578ae41061f93e0925eb6596f3c6ef6ccea6eb9
Parents: 74d2380
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 14 21:28:07 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 14 21:29:10 2013 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/util/ResourceUtils.java | 6 ------
 1 file changed, 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3578ae41/core/src/main/java/brooklyn/util/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/ResourceUtils.java b/core/src/main/java/brooklyn/util/ResourceUtils.java
index 9003e1a..1d37cb6 100644
--- a/core/src/main/java/brooklyn/util/ResourceUtils.java
+++ b/core/src/main/java/brooklyn/util/ResourceUtils.java
@@ -90,22 +90,16 @@ public class ResourceUtils {
         return new ResourceUtils(null);
     }
 
-    /** @deprecated since 0.6.0 use {@link ResourceUtils#create(ClassLoader, Object, String)} */
-    @Deprecated
     public ResourceUtils(ClassLoader loader, Object contextObject, String contextMessage) {
         this.loader = loader;
         this.contextObject = contextObject;
         this.context = contextMessage;
     }
 
-    /** @deprecated since 0.6.0 use {@link ResourceUtils#create(Object, String)} */
-    @Deprecated
     public ResourceUtils(Object contextObject, String contextMessage) {
         this(contextObject==null ? null : getClassLoaderForObject(contextObject), contextObject, contextMessage);
     }
 
-    /** @deprecated since 0.6.0 use {@link ResourceUtils#create(Object)} */
-    @Deprecated
     public ResourceUtils(Object contextObject) {
         this(contextObject, "for " + Strings.toString(contextObject));
     }


[28/50] brooklyn-server git commit: Updated AMI ids for Ubuntu 12.04 and RHEL 6.3 on aws-ec2:us-east-1

Posted by he...@apache.org.
Updated AMI ids for Ubuntu 12.04 and RHEL 6.3 on aws-ec2:us-east-1


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

Branch: refs/heads/0.6.0
Commit: 2f1a20783fbbefab9692231430a56ce8e2fd78d7
Parents: 4facfeb
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Nov 13 17:10:36 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Nov 13 17:10:36 2013 +0000

----------------------------------------------------------------------
 .../src/test/java/brooklyn/entity/AbstractEc2LiveTest.java   | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2f1a2078/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
index 011144f..9e5fa13 100644
--- a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
+++ b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
@@ -69,8 +69,8 @@ public abstract class AbstractEc2LiveTest extends BrooklynMgmtContextTestSupport
 
     @Test(groups = {"Live"})
     public void test_Ubuntu_12_0() throws Exception {
-        // Image: {id=us-east-1/ami-950680fc, providerId=ami-950680fc, name=RightImage_Ubuntu_12.04_x64_v5.8.8, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.manifest.xml, is64Bit=true}, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.manifest.xml, version=5.8.8, status=AVAILABLE[available], loginUser=root, userMetadata={owner=411009282317, rootDeviceType=instance-store, virtualizationType=paravirtual, hypervisor=xen}}
-        runTest(ImmutableMap.of("imageId", "us-east-1/ami-950680fc", "hardwareId", SMALL_HARDWARE_ID));
+        // Image: {id=us-east-1/ami-0769ee6e, providerId=ami-0769ee6e, name=RightImage_Ubuntu_12.04_x64_v5.8.8.5, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.5.manifest.xml, is64Bit=true}, description=rightscale-us-east/RightImage_Ubuntu_12.04_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-0769ee6e", "hardwareId", SMALL_HARDWARE_ID));
     }
 
     @Test(groups = {"Live"})
@@ -87,8 +87,8 @@ public abstract class AbstractEc2LiveTest extends BrooklynMgmtContextTestSupport
 
     @Test(groups = {"Live"})
     public void test_Red_Hat_Enterprise_Linux_6() throws Exception {
-        // Image: {id=us-east-1/ami-d258fbbb, providerId=ami-d258fbbb, name=RHEL-6.3-Starter-i386-1-Hourly2, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=rhel, arch=paravirtual, version=6.4, description=, is64Bit=true}, description=, version=6.3, status=AVAILABLE[available], loginUser=root, userMetadata={owner=309956199498, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
-        runTest(ImmutableMap.of("imageId", "us-east-1/ami-d258fbbb", "hardwareId", SMALL_HARDWARE_ID));
+        // Image: {id=us-east-1/ami-a35a33ca, providerId=ami-a35a33ca, name=RHEL-6.3_GA-x86_64-5-Hourly2, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=rhel, arch=paravirtual, version=6.0, description=309956199498/RHEL-6.3_GA-x86_64-5-Hourly2, is64Bit=true}, description=309956199498/RHEL-6.3_GA-x86_64-5-Hourly2, version=Hourly2, status=AVAILABLE[available], loginUser=root, userMetadata={owner=309956199498, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
+        runTest(ImmutableMap.of("imageId", "us-east-1/ami-a35a33ca", "hardwareId", SMALL_HARDWARE_ID));
     }
     
     protected void runTest(Map<String,?> flags) throws Exception {


[05/50] brooklyn-server git commit: Merge pull request #992 from Nakomis/hadoop-and-whirr-example

Posted by he...@apache.org.
Merge pull request #992 from Nakomis/hadoop-and-whirr-example

Hadoop and whirr example

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

Branch: refs/heads/0.6.0
Commit: 1ed1f10f3b48b397a2e5bca17d2f5a06b792ed72
Parents: 4c24127 d0851ba
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 4 08:51:32 2013 -0800
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 4 08:51:32 2013 -0800

----------------------------------------------------------------------
 systems/whirr/base/pom.xml                               | 11 +++++++++++
 .../brooklyn/extras/whirr/core/WhirrClusterImpl.java     |  6 ++++--
 2 files changed, 15 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[02/50] brooklyn-server git commit: Added explicit call to Entities.manage() for whirr entities (fixes entity display issue in web console)

Posted by he...@apache.org.
Added explicit call to Entities.manage() for whirr entities (fixes entity display issue in web console)


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

Branch: refs/heads/0.6.0
Commit: 233c2a2150ebf9bc77f5d354b2e0d84f172bb241
Parents: 5943d2d
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Nov 1 14:47:20 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Nov 1 14:47:20 2013 +0000

----------------------------------------------------------------------
 .../main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/233c2a21/systems/whirr/base/src/main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java
----------------------------------------------------------------------
diff --git a/systems/whirr/base/src/main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java b/systems/whirr/base/src/main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java
index 24b7dee..60d3841 100644
--- a/systems/whirr/base/src/main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java
+++ b/systems/whirr/base/src/main/java/brooklyn/extras/whirr/core/WhirrClusterImpl.java
@@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory;
 
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.location.Location;
 import brooklyn.location.MachineLocation;
@@ -195,12 +196,13 @@ public class WhirrClusterImpl extends AbstractEntity implements WhirrCluster {
                 addChild(EntitySpec.create(WhirrInstance.class).
                     displayName("Instance:" + instance.getId()).
                     configure("instance", instance));
+            Entities.manage(rolesGroup);
 
             for (String role: instance.getRoles()) {
                 log.info("Creating entity for '" + role + "' on instance " + instance.getId());
-                rolesGroup.addChild(EntitySpec.create(WhirrRole.class).
+                Entities.manage(rolesGroup.addChild(EntitySpec.create(WhirrRole.class).
                         displayName("Role:" + role).
-                        configure("role", role));
+                        configure("role", role)));
             }
             addGroup(rolesGroup);
         }


[15/50] brooklyn-server git commit: Fix JcloudsLocationTest

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

- only throw NoMachinesAvailableException if the last obtain attempt
  threw that; otherwise throw the underlying exception.
- (the problem is probably not that the cloud is full with no more
  machines available!)


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

Branch: refs/heads/0.6.0
Commit: 234103854578abcf0d9c317215c46ae89f9778de
Parents: 4265e66
Author: Aled Sage <al...@gmail.com>
Authored: Wed Nov 6 12:05:31 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Nov 6 16:12:02 2013 +0000

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocation.java        | 19 ++++++++++++++-----
 .../location/jclouds/JcloudsLocationTest.java    | 11 +++++++----
 2 files changed, 21 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/23410385/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 736a461..77389b0 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -73,6 +73,7 @@ import brooklyn.management.AccessController;
 import brooklyn.util.ResourceUtils;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
+import brooklyn.util.exceptions.CompoundRuntimeException;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.internal.Repeater;
@@ -370,19 +371,27 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
     public JcloudsSshMachineLocation obtain(Map<?,?> flags) throws NoMachinesAvailableException {
         ConfigBag setup = ConfigBag.newInstanceExtending(getConfigBag(), flags);
         Integer attempts = setup.get(MACHINE_CREATE_ATTEMPTS);
-        Exception lastThrownException = null;
+        List<Exception> exceptions = Lists.newArrayList();
         if (attempts == null || attempts < 1) attempts = 1;
         for (int i = 1; i <= attempts; i++) {
             try {
                 return obtainOnce(flags, setup);
             } catch (RuntimeException e) {
                 LOG.warn("Attempt #{}/{} to obtain machine threw error: {}", new Object[]{i, attempts, e});
-                lastThrownException = e;
+                exceptions.add(e);
             }
         }
-        throw new NoMachinesAvailableException(
-                String.format("Failed to get VM after %d attempt%s.", attempts, attempts == 1 ? "" : "s"),
-                lastThrownException);
+        String msg = String.format("Failed to get VM after %d attempt%s.", attempts, attempts == 1 ? "" : "s");
+
+        Exception cause = (exceptions.size() == 1) 
+                ? exceptions.get(0)
+                : new CompoundRuntimeException(msg + " Causes include: "+exceptions.get(exceptions.size()-1), exceptions);
+
+        if (exceptions.get(exceptions.size()-1) instanceof NoMachinesAvailableException) {
+            throw new NoMachinesAvailableException(msg, cause);
+        } else {
+            throw Exceptions.propagate(cause);
+        }
     }
 
     protected JcloudsSshMachineLocation obtainOnce(Map<?, ?> flags, ConfigBag setup) throws NoMachinesAvailableException {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/23410385/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
index aaf9734..75bc7a7 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
@@ -26,6 +26,7 @@ import brooklyn.management.internal.LocalManagementContext;
 import brooklyn.test.Asserts;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
+import brooklyn.util.exceptions.CompoundRuntimeException;
 import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Function;
@@ -65,8 +66,9 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
         protected void tryObtainAndCheck(Map<?,?> flags, Predicate<? super ConfigBag> test) {
             try {
                 obtain(flags);
-            } catch (NoMachinesAvailableException e) {
-                if (e.getCause()==BAIL_OUT_FOR_TESTING) {
+            } catch (Exception e) {
+                if (e==BAIL_OUT_FOR_TESTING || e.getCause()==BAIL_OUT_FOR_TESTING 
+                        || (e instanceof CompoundRuntimeException && ((CompoundRuntimeException)e).getAllCauses().contains(BAIL_OUT_FOR_TESTING))) {
                     test.apply(lastConfigBag);
                 } else {
                     throw Exceptions.propagate(e);
@@ -134,6 +136,7 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
                 .put(ACCESS_CREDENTIAL, "bogus")
                 .put(USER, "fred")
                 .put(MIN_RAM, 16)
+                .put(JcloudsLocation.MACHINE_CREATE_ATTEMPTS, 1)
                 .putAll((Map)config)
                 .build();
         return managementContext.getLocationManager().createLocation(LocationSpec.create(BailOutJcloudsLocation.class)
@@ -275,7 +278,7 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
         Assert.assertEquals(jcl.buildTemplateCount, 3);
     }
 
-    @Test(groups="Live")
+    @Test(groups={"Live", "Live-sanity"})
     public void testCreateWithInboundPorts() {
         BailOutWithTemplateJcloudsLocation jcloudsLocation = newSampleBailOutWithTemplateJcloudsLocation();
         jcloudsLocation = (BailOutWithTemplateJcloudsLocation) jcloudsLocation.newSubLocation(MutableMap.of());
@@ -284,7 +287,7 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
         Assert.assertEquals(jcloudsLocation.template.getOptions().getInboundPorts(), ports);
     }
     
-    @Test(groups="Live")
+    @Test(groups={"Live", "Live-sanity"})
     public void testCreateWithInboundPortsOverride() {
         BailOutWithTemplateJcloudsLocation jcloudsLocation = newSampleBailOutWithTemplateJcloudsLocation();
         jcloudsLocation = (BailOutWithTemplateJcloudsLocation) jcloudsLocation.newSubLocation(MutableMap.of());


[39/50] brooklyn-server git commit: Updated Rackspace UK image ID and converted test to Java

Posted by he...@apache.org.
Updated Rackspace UK image ID and converted test to Java


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

Branch: refs/heads/0.6.0
Commit: c4a55600d3bf57e1b9cc0ef8aa1dfefac2062d2b
Parents: b0761ca
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 16:41:33 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 17:40:54 2013 +0000

----------------------------------------------------------------------
 .../jclouds/RackspaceLocationLiveTest.groovy    | 41 -------------------
 .../jclouds/RackspaceLocationLiveTest.java      | 43 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c4a55600/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.groovy
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.groovy b/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.groovy
deleted file mode 100644
index eec702e..0000000
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.groovy
+++ /dev/null
@@ -1,41 +0,0 @@
-package brooklyn.location.jclouds
-
-import static org.testng.Assert.*
-
-import org.testng.annotations.DataProvider
-import org.testng.annotations.Test
-
-public class RackspaceLocationLiveTest extends AbstractJcloudsLocationTest {
-    
-    private static final String PROVIDER = "rackspace-cloudservers-uk"
-    private static final String REGION_NAME = null;
-    private static final String IMAGE_ID = "115"
-    private static final String IMAGE_NAME_PATTERN = "Ubuntu 11.04"
-    private static final String IMAGE_OWNER = null
-    
-    public RackspaceLocationLiveTest() {
-        super(PROVIDER)
-    }
-    
-    @Override
-    @DataProvider(name = "fromImageId")
-    public Object[][] cloudAndImageIds() {
-        return [ [ REGION_NAME, IMAGE_ID, IMAGE_OWNER ] ]
-    }
-
-    @Override
-    @DataProvider(name = "fromImageNamePattern")
-    public Object[][] cloudAndImageNamePatterns() {
-        return [ [ REGION_NAME, IMAGE_NAME_PATTERN, IMAGE_OWNER ] ]
-    }
-    
-    @Override
-    @DataProvider(name = "fromImageDescriptionPattern")
-    public Object[][] cloudAndImageDescriptionPatterns() {
-        return []
-    }
-    
-    @Test(enabled = false)
-    public void noop() { /* just exists to let testNG IDE run the test */ }
-    
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c4a55600/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.java
new file mode 100644
index 0000000..2472ba4
--- /dev/null
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/RackspaceLocationLiveTest.java
@@ -0,0 +1,43 @@
+package brooklyn.location.jclouds;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class RackspaceLocationLiveTest extends AbstractJcloudsLocationTest {
+
+    private static final String PROVIDER = "rackspace-cloudservers-uk";
+    private static final String REGION_NAME = null;
+    private static final String IMAGE_ID = "LON/f70ed7c7-b42e-4d77-83d8-40fa29825b85"; // CentOS 6.4
+    private static final String IMAGE_NAME_PATTERN = "Ubuntu 13.04";
+    private static final String IMAGE_OWNER = null;
+
+    public RackspaceLocationLiveTest() {
+        super(PROVIDER);
+    }
+
+    @Override
+    @DataProvider(name = "fromImageId")
+    public Object[][] cloudAndImageIds() {
+        return new Object[][] {
+            new Object[] { REGION_NAME, IMAGE_ID, IMAGE_OWNER }
+        };
+    }
+
+    @Override
+    @DataProvider(name = "fromImageNamePattern")
+    public Object[][] cloudAndImageNamePatterns() {
+        return new Object[][] {
+            new Object[] { REGION_NAME, IMAGE_NAME_PATTERN, IMAGE_OWNER }
+        };
+    }
+
+    @Override
+    @DataProvider(name = "fromImageDescriptionPattern")
+    public Object[][] cloudAndImageDescriptionPatterns() {
+        return new Object[0][0];
+    }
+
+    @Test(enabled = false)
+    public void noop() { /* just exists to let testNG IDE run the test */ }
+
+}


[34/50] brooklyn-server git commit: Use brooklyn.properties when creating management context in AbstractJcloudsLocationTest

Posted by he...@apache.org.
Use brooklyn.properties when creating management context in AbstractJcloudsLocationTest


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

Branch: refs/heads/0.6.0
Commit: dfe4c0f4fb1c20bb702d3d83fa3753998af10d54
Parents: 6109dd6
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 13:39:04 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 15:00:04 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/dfe4c0f4/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
index 15f2f60..be699ae 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
@@ -9,6 +9,7 @@ import org.testng.annotations.BeforeMethod
 import org.testng.annotations.DataProvider
 import org.testng.annotations.Test
 
+import brooklyn.config.BrooklynProperties;
 import brooklyn.entity.basic.Entities
 import brooklyn.location.basic.SshMachineLocation
 import brooklyn.management.ManagementContext
@@ -59,7 +60,8 @@ public abstract class AbstractJcloudsLocationTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setUp() {
-        ctx = Entities.newManagementContext(ImmutableMap.of("provider", provider));
+        BrooklynProperties props = BrooklynProperties.Factory.newDefault().addFromMap(ImmutableMap.of("provider", provider))
+        ctx = Entities.newManagementContext(props);
     }
 
     @AfterMethod(alwaysRun=true)


[26/50] brooklyn-server git commit: Oops, missed Identifiable interface!

Posted by he...@apache.org.
Oops, missed Identifiable interface!

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

Branch: refs/heads/0.6.0
Commit: 331cc4702b5d26a07b533ebe6ee4f111f87ff7fc
Parents: ab35717
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 12 22:15:17 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 12 22:15:17 2013 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/entity/trait/Identifiable.java | 6 ++++++
 1 file changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/331cc470/api/src/main/java/brooklyn/entity/trait/Identifiable.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/trait/Identifiable.java b/api/src/main/java/brooklyn/entity/trait/Identifiable.java
new file mode 100644
index 0000000..5d3b859
--- /dev/null
+++ b/api/src/main/java/brooklyn/entity/trait/Identifiable.java
@@ -0,0 +1,6 @@
+package brooklyn.entity.trait;
+
+public interface Identifiable {
+
+    String getId();
+}


[32/50] brooklyn-server git commit: Updated Ubuntu 12.04 AMI id for aws-ec2:us-east-1 to prevent hanging

Posted by he...@apache.org.
Updated Ubuntu 12.04 AMI id for aws-ec2:us-east-1 to prevent hanging


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

Branch: refs/heads/0.6.0
Commit: 8b7ba8838e5888264fb9e9ac8992cbe75b174ac7
Parents: a22f5cb
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 13:07:27 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 13:07:27 2013 +0000

----------------------------------------------------------------------
 .../base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b7ba883/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
index ac9e800..8bd3061 100644
--- a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
+++ b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
@@ -70,8 +70,8 @@ public abstract class AbstractEc2LiveTest extends BrooklynMgmtContextTestSupport
 
     @Test(groups = {"Live"})
     public void test_Ubuntu_12_0() throws Exception {
-        // Image: {id=us-east-1/ami-0769ee6e, providerId=ami-0769ee6e, name=RightImage_Ubuntu_12.04_x64_v5.8.8.5, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.5.manifest.xml, is64Bit=true}, description=rightscale-us-east/RightImage_Ubuntu_12.04_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-0769ee6e", "hardwareId", SMALL_HARDWARE_ID));
+        // Image: {id=us-east-1/ami-d0f89fb9, providerId=ami-d0f89fb9, name=ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, is64Bit=true}, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, version=20130411.1, status=AVAILABLE[available], loginUser=ubuntu, userMetadata={owner=099720109477, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
+        runTest(ImmutableMap.of("imageId", "us-east-1/ami-d0f89fb9", "hardwareId", SMALL_HARDWARE_ID));
     }
 
     @Test(groups = {"Live"})


[07/50] brooklyn-server git commit: Adds EnricherSpec

Posted by he...@apache.org.
Adds EnricherSpec


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

Branch: refs/heads/0.6.0
Commit: b8216c5e5e076160f23d4f8e869e0b3f4d024cd8
Parents: 9f591ed
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 4 23:22:58 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 5 13:05:47 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/proxying/EntitySpec.java    |  41 ++++-
 .../main/java/brooklyn/policy/EnricherSpec.java | 175 +++++++++++++++++++
 .../main/java/brooklyn/policy/EnricherType.java |  38 ++++
 .../entity/proxying/InternalEntityFactory.java  |  10 ++
 .../entity/proxying/InternalPolicyFactory.java  |  71 +++++++-
 .../brooklyn/entity/basic/EntitySpecTest.java   |  42 ++++-
 6 files changed, 371 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
index d654be0..28476a5 100644
--- a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
+++ b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
@@ -19,6 +19,8 @@ import brooklyn.config.ConfigKey;
 import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.entity.Entity;
 import brooklyn.management.Task;
+import brooklyn.policy.Enricher;
+import brooklyn.policy.EnricherSpec;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
 import brooklyn.util.exceptions.Exceptions;
@@ -112,6 +114,8 @@ public class EntitySpec<T extends Entity> implements Serializable {
     private final Map<ConfigKey<?>, Object> config = Maps.newLinkedHashMap();
     private final List<Policy> policies = Lists.newArrayList();
     private final List<PolicySpec<?>> policySpecs = Lists.newArrayList();
+    private final List<Enricher> enrichers = Lists.newArrayList();
+    private final List<EnricherSpec<?>> enricherSpecs = Lists.newArrayList();
     private final Set<Class<?>> additionalInterfaces = Sets.newLinkedHashSet();
     private final List<EntityInitializer> entityInitializers = Lists.newArrayList();
     private volatile boolean immutable;
@@ -188,6 +192,14 @@ public class EntitySpec<T extends Entity> implements Serializable {
         return policies;
     }
     
+    public List<EnricherSpec<?>> getEnricherSpecs() {
+        return enricherSpecs;
+    }
+    
+    public List<Enricher> getEnrichers() {
+        return enrichers;
+    }
+    
     public EntitySpec<T> displayName(String val) {
         checkMutable();
         displayName = val;
@@ -313,7 +325,6 @@ public class EntitySpec<T extends Entity> implements Serializable {
         return this;
     }
     
-
     /** adds the supplied policies to the spec */
     public <V> EntitySpec<T> policies(Iterable<? extends Policy> val) {
         checkMutable();
@@ -321,6 +332,34 @@ public class EntitySpec<T extends Entity> implements Serializable {
         return this;
     }
     
+    /** adds a policy to the spec */
+    public <V> EntitySpec<T> enricher(Enricher val) {
+        checkMutable();
+        enrichers.add(checkNotNull(val, "enricher"));
+        return this;
+    }
+
+    /** adds a policy to the spec */
+    public <V> EntitySpec<T> enricher(EnricherSpec<?> val) {
+        checkMutable();
+        enricherSpecs.add(checkNotNull(val, "enricherSpec"));
+        return this;
+    }
+
+    /** adds the supplied policies to the spec */
+    public <V> EntitySpec<T> enricherSpecs(Iterable<? extends EnricherSpec<?>> val) {
+        checkMutable();
+        enricherSpecs.addAll(Sets.newLinkedHashSet(checkNotNull(val, "enricherSpecs")));
+        return this;
+    }
+    
+    /** adds the supplied policies to the spec */
+    public <V> EntitySpec<T> enrichers(Iterable<? extends Enricher> val) {
+        checkMutable();
+        enrichers.addAll(Sets.newLinkedHashSet(checkNotNull(val, "enrichers")));
+        return this;
+    }
+    
     /** "seals" this spec, preventing any future changes */
     public EntitySpec<T> immutable() {
         immutable = true;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/api/src/main/java/brooklyn/policy/EnricherSpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/EnricherSpec.java b/api/src/main/java/brooklyn/policy/EnricherSpec.java
new file mode 100644
index 0000000..d25f832
--- /dev/null
+++ b/api/src/main/java/brooklyn/policy/EnricherSpec.java
@@ -0,0 +1,175 @@
+package brooklyn.policy;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.Serializable;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.config.ConfigKey.HasConfigKey;
+import brooklyn.management.Task;
+import brooklyn.util.exceptions.Exceptions;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Maps;
+
+/**
+ * Gives details of an enricher to be created. It describes the enricher's configuration, and is
+ * reusable to create multiple enrichers with the same configuration.
+ * 
+ * To create an EnricherSpec, it is strongly encouraged to use {@code create(...)} methods.
+ * 
+ * @param <T> The type of enricher to be created
+ * 
+ * @author aled
+ */
+public class EnricherSpec<T extends Enricher> implements Serializable {
+
+    private static final Logger log = LoggerFactory.getLogger(EnricherSpec.class);
+
+    private final static long serialVersionUID = 1L;
+
+
+    /**
+     * Creates a new {@link EnricherSpec} instance for an enricher of the given type. The returned 
+     * {@link EnricherSpec} can then be customized.
+     * 
+     * @param type A {@link Enricher} class
+     */
+    public static <T extends Enricher> EnricherSpec<T> create(Class<T> type) {
+        return new EnricherSpec<T>(type);
+    }
+    
+    /**
+     * Creates a new {@link EnricherSpec} instance with the given config, for an enricher of the given type.
+     * 
+     * This is primarily for groovy code; equivalent to {@code EnricherSpec.create(type).configure(config)}.
+     * 
+     * @param config The spec's configuration (see {@link EnricherSpec#configure(Map)}).
+     * @param type   An {@link Enricher} class
+     */
+    public static <T extends Enricher> EnricherSpec<T> create(Map<?,?> config, Class<T> type) {
+        return EnricherSpec.create(type).configure(config);
+    }
+    
+    private final Class<T> type;
+    private String displayName;
+    private final Map<String, Object> flags = Maps.newLinkedHashMap();
+    private final Map<ConfigKey<?>, Object> config = Maps.newLinkedHashMap();
+
+    protected EnricherSpec(Class<T> type) {
+        checkIsImplementation(type);
+        checkIsNewStyleImplementation(type);
+        this.type = type;
+    }
+    
+    public EnricherSpec<T> displayName(String val) {
+        displayName = val;
+        return this;
+    }
+
+    public EnricherSpec<T> configure(Map<?,?> val) {
+        for (Map.Entry<?, ?> entry: val.entrySet()) {
+            if (entry.getKey()==null) throw new NullPointerException("Null key not permitted");
+            if (entry.getKey() instanceof CharSequence)
+                flags.put(entry.getKey().toString(), entry.getValue());
+            else if (entry.getKey() instanceof ConfigKey<?>)
+                config.put((ConfigKey<?>)entry.getKey(), entry.getValue());
+            else if (entry.getKey() instanceof HasConfigKey<?>)
+                config.put(((HasConfigKey<?>)entry.getKey()).getConfigKey(), entry.getValue());
+            else {
+                log.warn("Spec "+this+" ignoring unknown config key "+entry.getKey());
+            }
+        }
+        return this;
+    }
+    
+    public EnricherSpec<T> configure(CharSequence key, Object val) {
+        flags.put(checkNotNull(key, "key").toString(), val);
+        return this;
+    }
+    
+    public <V> EnricherSpec<T> configure(ConfigKey<V> key, V val) {
+        config.put(checkNotNull(key, "key"), val);
+        return this;
+    }
+
+    public <V> EnricherSpec<T> configureIfNotNull(ConfigKey<V> key, V val) {
+        return (val != null) ? configure(key, val) : this;
+    }
+
+    public <V> EnricherSpec<T> configure(ConfigKey<V> key, Task<? extends V> val) {
+        config.put(checkNotNull(key, "key"), val);
+        return this;
+    }
+
+    public <V> EnricherSpec<T> configure(HasConfigKey<V> key, V val) {
+        config.put(checkNotNull(key, "key").getConfigKey(), val);
+        return this;
+    }
+
+    public <V> EnricherSpec<T> configure(HasConfigKey<V> key, Task<? extends V> val) {
+        config.put(checkNotNull(key, "key").getConfigKey(), val);
+        return this;
+    }
+
+    /**
+     * @return The type of the enricher
+     */
+    public Class<T> getType() {
+        return type;
+    }
+    
+    /**
+     * @return The display name of the enricher
+     */
+    public String getDisplayName() {
+        return displayName;
+    }
+    
+    /**
+     * @return Read-only construction flags
+     * @see SetFromFlag declarations on the enricher type
+     */
+    public Map<String, ?> getFlags() {
+        return Collections.unmodifiableMap(flags);
+    }
+    
+    /**
+     * @return Read-only configuration values
+     */
+    public Map<ConfigKey<?>, Object> getConfig() {
+        return Collections.unmodifiableMap(config);
+    }
+        
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(this).add("type", type).toString();
+    }
+    
+    // TODO Duplicates method in EntitySpec and BasicEntityTypeRegistry
+    private void checkIsImplementation(Class<?> val) {
+        if (!Enricher.class.isAssignableFrom(val)) throw new IllegalStateException("Implementation "+val+" does not implement "+Enricher.class.getName());
+        if (val.isInterface()) throw new IllegalStateException("Implementation "+val+" is an interface, but must be a non-abstract class");
+        if (Modifier.isAbstract(val.getModifiers())) throw new IllegalStateException("Implementation "+val+" is abstract, but must be a non-abstract class");
+    }
+
+    // TODO Duplicates method in EntitySpec, BasicEntityTypeRegistry, and InternalEntityFactory.isNewStyleEntity
+    private void checkIsNewStyleImplementation(Class<?> implClazz) {
+        try {
+            implClazz.getConstructor(new Class[0]);
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException("Implementation "+implClazz+" must have a no-argument constructor");
+        } catch (SecurityException e) {
+            throw Exceptions.propagate(e);
+        }
+        
+        if (implClazz.isInterface()) throw new IllegalStateException("Implementation "+implClazz+" is an interface, but must be a non-abstract class");
+        if (Modifier.isAbstract(implClazz.getModifiers())) throw new IllegalStateException("Implementation "+implClazz+" is abstract, but must be a non-abstract class");
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/api/src/main/java/brooklyn/policy/EnricherType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/EnricherType.java b/api/src/main/java/brooklyn/policy/EnricherType.java
new file mode 100644
index 0000000..43fb6ea
--- /dev/null
+++ b/api/src/main/java/brooklyn/policy/EnricherType.java
@@ -0,0 +1,38 @@
+package brooklyn.policy;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import brooklyn.config.ConfigKey;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Gives type information for an {@link Enricher}. It is immutable.
+ * 
+ * For enrichers that can support config keys etc being added on-the-fly,
+ * then this EnricherType will be a snapshot and subsequent snapshots will
+ * include the changes.
+ * 
+ * @since 0.6
+ */
+@Beta
+public interface EnricherType extends Serializable {
+
+    // TODO Consider merging this with PolicyType? Have a common super-type? It also has overlap with EntityType.
+    
+    /**
+     * The type name of this policy (normally the fully qualified class name).
+     */
+    String getName();
+    
+    /**
+     * ConfigKeys available on this policy.
+     */
+    Set<ConfigKey<?>> getConfigKeys();
+    
+    /**
+     * The ConfigKey with the given name, or null if not found.
+     */
+    ConfigKey<?> getConfigKey(String name);
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index b8e870a..6bc4791 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@ -16,6 +16,8 @@ import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.ManagementContextInternal;
+import brooklyn.policy.Enricher;
+import brooklyn.policy.EnricherSpec;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
 import brooklyn.policy.basic.AbstractPolicy;
@@ -154,6 +156,14 @@ public class InternalEntityFactory {
             for (EntityInitializer initializer: spec.getInitializers())
                 initializer.apply((EntityInternal)entity);
             
+            for (Enricher enricher : spec.getEnrichers()) {
+                entity.addEnricher(enricher);
+            }
+            
+            for (EnricherSpec<?> enricherSpec : spec.getEnricherSpecs()) {
+                entity.addEnricher(policyFactory.createEnricher(enricherSpec));
+            }
+            
             for (Policy policy : spec.getPolicies()) {
                 entity.addPolicy((AbstractPolicy)policy);
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
index c4d4358..c51144d 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalPolicyFactory.java
@@ -6,8 +6,11 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 
 import brooklyn.config.ConfigKey;
+import brooklyn.enricher.basic.AbstractEnricher;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.internal.ManagementContextInternal;
+import brooklyn.policy.Enricher;
+import brooklyn.policy.EnricherSpec;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
 import brooklyn.policy.basic.AbstractPolicy;
@@ -73,7 +76,20 @@ public class InternalPolicyFactory {
     
     public static boolean isNewStylePolicy(Class<?> clazz) {
         if (!Policy.class.isAssignableFrom(clazz)) {
-            throw new IllegalArgumentException("Class "+clazz+" is not an policy");
+            throw new IllegalArgumentException("Class "+clazz+" is not a policy");
+        }
+        
+        try {
+            clazz.getConstructor(new Class[0]);
+            return true;
+        } catch (NoSuchMethodException e) {
+            return false;
+        }
+    }
+    
+    public static boolean isNewStyleEnricher(Class<?> clazz) {
+        if (!Enricher.class.isAssignableFrom(clazz)) {
+            throw new IllegalArgumentException("Class "+clazz+" is not an enricher");
         }
         
         try {
@@ -129,6 +145,47 @@ public class InternalPolicyFactory {
         }
     }
     
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public <T extends Enricher> T createEnricher(EnricherSpec<T> spec) {
+        if (spec.getFlags().containsKey("parent")) {
+            throw new IllegalArgumentException("Spec's flags must not contain parent; use spec.parent() instead for "+spec);
+        }
+        
+        try {
+            Class<? extends T> clazz = spec.getType();
+            
+            FactoryConstructionTracker.setConstructing();
+            T enricher;
+            try {
+                enricher = construct(clazz, spec);
+            } finally {
+                FactoryConstructionTracker.reset();
+            }
+            
+            if (spec.getDisplayName()!=null)
+                ((AbstractEnricher)enricher).setName(spec.getDisplayName());
+            
+            if (isNewStyleEnricher(clazz)) {
+                ((AbstractEnricher)enricher).setManagementContext(managementContext);
+                Map<String, Object> config = ConfigBag.newInstance().putAll(spec.getFlags()).putAll(spec.getConfig()).getAllConfig();
+                ((AbstractEnricher)enricher).configure(MutableMap.copyOf(config)); // TODO AbstractEnricher.configure modifies the map
+            }
+            
+            // TODO Can we avoid this for "new-style policies"? Should we just trust the configure() method, 
+            // which the user may have overridden? 
+            // Also see InternalLocationFactory for same issue, which this code is based on.
+            for (Map.Entry<ConfigKey<?>, Object> entry : spec.getConfig().entrySet()) {
+                ((AbstractEnricher)enricher).setConfig((ConfigKey)entry.getKey(), entry.getValue());
+            }
+            ((AbstractEnricher)enricher).init();
+            
+            return enricher;
+            
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+    
     private <T extends Policy> T construct(Class<? extends T> clazz, PolicySpec<T> spec) throws InstantiationException, IllegalAccessException, InvocationTargetException {
         if (isNewStylePolicy(clazz)) {
             return clazz.newInstance();
@@ -137,8 +194,16 @@ public class InternalPolicyFactory {
         }
     }
     
-    private <T extends Policy> T constructOldStyle(Class<? extends T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
-        Optional<? extends T> v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
+    private <T extends Enricher> T construct(Class<? extends T> clazz, EnricherSpec<T> spec) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+        if (isNewStyleEnricher(clazz)) {
+            return clazz.newInstance();
+        } else {
+            return constructOldStyle(clazz, MutableMap.copyOf(spec.getFlags()));
+        }
+    }
+    
+    private <T> T constructOldStyle(Class<T> clazz, Map<String,?> flags) throws InstantiationException, IllegalAccessException, InvocationTargetException {
+        Optional<T> v = Reflections.invokeConstructorWithArgs(clazz, new Object[] {MutableMap.copyOf(flags)}, true);
         if (v.isPresent()) {
             return v.get();
         } else {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b8216c5e/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java b/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
index 3d5f05d..19e4842 100644
--- a/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/EntitySpecTest.java
@@ -3,13 +3,20 @@ package brooklyn.entity.basic;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
+import java.util.Map;
+
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import brooklyn.config.ConfigKey;
+import brooklyn.enricher.basic.AbstractEnricher;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.location.basic.SimulatedLocation;
+import brooklyn.policy.Enricher;
+import brooklyn.policy.EnricherSpec;
+import brooklyn.policy.EnricherType;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicySpec;
 import brooklyn.policy.basic.AbstractPolicy;
@@ -69,9 +76,40 @@ public class EntitySpecTest {
         assertEquals(Iterables.getOnlyElement(entity.getPolicies()), policy);
     }
     
+    @Test
+    public void testAddsEnricherSpec() throws Exception {
+        entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
+                .enricher(EnricherSpec.create(MyEnricher.class)
+                        .displayName("myenrichername")
+                        .configure(MyEnricher.CONF1, "myconf1val")
+                        .configure("myfield", "myfieldval")));
+        
+        Enricher enricher = Iterables.getOnlyElement(entity.getEnrichers());
+        assertTrue(enricher instanceof MyEnricher, "enricher="+enricher);
+        assertEquals(enricher.getName(), "myenrichername");
+        assertEquals(enricher.getConfig(MyEnricher.CONF1), "myconf1val");
+    }
+    
+    @Test
+    public void testAddsEnricher() throws Exception {
+        MyEnricher enricher = new MyEnricher();
+        entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
+                .enricher(enricher));
+        
+        assertEquals(Iterables.getOnlyElement(entity.getEnrichers()), enricher);
+    }
+    
     public static class MyPolicy extends AbstractPolicy {
-        public static final BasicConfigKey<String> CONF1 = new BasicConfigKey<String>(String.class, "test.conf1", "my descr, conf1", "defaultval1");
-        public static final BasicConfigKey<Integer> CONF2 = new BasicConfigKey<Integer>(Integer.class, "test.conf2", "my descr, conf2", 2);
+        public static final BasicConfigKey<String> CONF1 = new BasicConfigKey<String>(String.class, "testpolicy.conf1", "my descr, conf1", "defaultval1");
+        public static final BasicConfigKey<Integer> CONF2 = new BasicConfigKey<Integer>(Integer.class, "testpolicy.conf2", "my descr, conf2", 2);
+        
+        @SetFromFlag
+        public String myfield;
+    }
+    
+    public static class MyEnricher extends AbstractEnricher {
+        public static final BasicConfigKey<String> CONF1 = new BasicConfigKey<String>(String.class, "testenricher.conf1", "my descr, conf1", "defaultval1");
+        public static final BasicConfigKey<Integer> CONF2 = new BasicConfigKey<Integer>(Integer.class, "testenricher.conf2", "my descr, conf2", 2);
         
         @SetFromFlag
         public String myfield;


[24/50] brooklyn-server git commit: XML persist: fix serializing MutableSet

Posted by he...@apache.org.
XML persist: fix serializing MutableSet


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

Branch: refs/heads/0.6.0
Commit: 8aa09c50bbd35032b8ed01f812dfbec5c75246f4
Parents: c7ff592
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 12 11:18:22 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 12 21:53:10 2013 +0000

----------------------------------------------------------------------
 .../util/xstream/MutableSetConverter.java       | 26 ++++++
 .../brooklyn/util/xstream/XmlSerializer.java    | 11 ++-
 .../persister/XmlMementoSerializerTest.java     | 94 ++++++++++++++++++++
 3 files changed, 130 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java b/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
new file mode 100644
index 0000000..10bb618
--- /dev/null
+++ b/core/src/main/java/brooklyn/util/xstream/MutableSetConverter.java
@@ -0,0 +1,26 @@
+package brooklyn.util.xstream;
+
+import brooklyn.util.collections.MutableSet;
+
+import com.thoughtworks.xstream.converters.collections.CollectionConverter;
+import com.thoughtworks.xstream.mapper.Mapper;
+
+public class MutableSetConverter extends CollectionConverter {
+
+    // Although this class seems pointless (!), without registering an explicit converter for MutableSet then the
+    // declaration for Set interferes, causing MutableSet.map field to be null on deserialization.
+    
+    public MutableSetConverter(Mapper mapper) {
+        super(mapper);
+    }
+
+    @Override
+    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
+        return MutableSet.class.isAssignableFrom(type);
+    }
+
+    @Override
+    protected Object createCollection(Class type) {
+        return new MutableSet<Object>();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java b/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
index 55e68b4..b266259 100644
--- a/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
+++ b/core/src/main/java/brooklyn/util/xstream/XmlSerializer.java
@@ -9,7 +9,9 @@ import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
+import brooklyn.util.collections.MutableList;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
 
 import com.google.common.collect.ImmutableList;
 import com.thoughtworks.xstream.XStream;
@@ -27,10 +29,17 @@ public class XmlSerializer<T> {
         
         xstream.registerConverter(new StringKeyMapConverter(xstream.getMapper()), /* priority */ 10);
         xstream.alias("MutableMap", MutableMap.class);
+        xstream.alias("MutableSet", MutableSet.class);
+        xstream.alias("MutableList", MutableList.class);
+        
+        // Needs an explicit MutableSet converter!
+        // Without it, the alias for "set" seems to interfere with the MutableSet.map field, so it gets
+        // a null field on deserialization.
+        xstream.registerConverter(new MutableSetConverter(xstream.getMapper()));
         
         xstream.aliasType("ImmutableList", ImmutableList.class);
         xstream.registerConverter(new ImmutableListConverter(xstream.getMapper()));
-        
+
         xstream.registerConverter(new EnumCaseForgivingConverter());
         xstream.registerConverter(new Inet4AddressConverter());
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8aa09c50/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
new file mode 100644
index 0000000..855de46
--- /dev/null
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
@@ -0,0 +1,94 @@
+package brooklyn.entity.rebind.persister;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.collections.MutableSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+public class XmlMementoSerializerTest {
+
+    private XmlMementoSerializer<Object> serializer;
+
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception {
+        serializer = new XmlMementoSerializer<Object>(XmlMementoSerializerTest.class.getClassLoader());
+    }
+    
+    @Test
+    public void testMutableSet() throws Exception {
+        Set<?> obj = MutableSet.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedHashSet() throws Exception {
+        Set<String> obj = new LinkedHashSet<String>();
+        obj.add("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableSet() throws Exception {
+        Set<String> obj = ImmutableSet.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testMutableList() throws Exception {
+        List<?> obj = MutableList.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedList() throws Exception {
+        List<String> obj = new LinkedList<String>();
+        obj.add("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableList() throws Exception {
+        List<String> obj = ImmutableList.of("123");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testMutableMap() throws Exception {
+        Map<?,?> obj = MutableMap.of("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testLinkedHashMap() throws Exception {
+        Map<String,String> obj = new LinkedHashMap<String,String>();
+        obj.put("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    @Test
+    public void testImmutableMap() throws Exception {
+        Map<?,?> obj = ImmutableMap.of("mykey", "myval");
+        assertSerializeAndDeserialize(obj);
+    }
+    
+    private void assertSerializeAndDeserialize(Object obj) throws Exception {
+        String serializedForm = serializer.toString(obj);
+        Object deserialized = serializer.fromString(serializedForm);
+        assertEquals(deserialized, obj);
+    }
+}


[19/50] brooklyn-server git commit: Merge pull request #999 from aledsage/feature/jclouds-max-concurrent-creates-0.6.0

Posted by he...@apache.org.
Merge pull request #999 from aledsage/feature/jclouds-max-concurrent-creates-0.6.0

Feature: jclouds max-concurrent-creates (in 0.6.x)

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

Branch: refs/heads/0.6.0
Commit: 69fd8d51d226295efe474833e7c4e79cb68258f8
Parents: 0bcb744 2341038
Author: Andrew Kennedy <gr...@apache.org>
Authored: Thu Nov 7 10:03:25 2013 -0800
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Thu Nov 7 10:03:25 2013 -0800

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocation.java       |  75 ++++--
 .../location/jclouds/JcloudsLocationConfig.java |   7 +
 .../location/jclouds/JcloudsLocationTest.java   | 265 +++++++++++++++----
 3 files changed, 277 insertions(+), 70 deletions(-)
----------------------------------------------------------------------



[38/50] brooklyn-server git commit: Fixed template builder option names for imageDescriptionRegex and imageNameRegex

Posted by he...@apache.org.
Fixed template builder option names for imageDescriptionRegex and imageNameRegex


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

Branch: refs/heads/0.6.0
Commit: b0761cae8f75e2851e7efade11e63b9b91267546
Parents: ab22dec
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 16:24:16 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 16:24:16 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/b0761cae/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
index be699ae..3ef7e8e 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLocationTest.groovy
@@ -105,7 +105,7 @@ public abstract class AbstractJcloudsLocationTest {
     @Test(groups = [ "Live" ], dataProvider="fromImageNamePattern")
     public void testProvisionVmUsingImageNamePattern(String regionName, String imageNamePattern, String imageOwner) {
         loc = ctx.getLocationRegistry().resolve(provider + (regionName == null ? "" : ":" + regionName));
-        SshMachineLocation machine = obtainMachine([imageNamePattern:imageNamePattern, imageOwner:imageOwner])
+        SshMachineLocation machine = obtainMachine([imageNameRegex:imageNamePattern, imageOwner:imageOwner])
         
         LOG.info("Provisioned AWS vm $machine; checking if ssh'able")
         assertTrue machine.isSshable()
@@ -114,7 +114,7 @@ public abstract class AbstractJcloudsLocationTest {
     @Test(groups = "Live", dataProvider="fromImageDescriptionPattern")
     public void testProvisionVmUsingImageDescriptionPattern(String regionName, String imageDescriptionPattern, String imageOwner) {
         loc = ctx.getLocationRegistry().resolve(provider + (regionName == null ? "" : ":" + regionName));
-        SshMachineLocation machine = obtainMachine([imageDescriptionPattern:imageDescriptionPattern, imageOwner:imageOwner])
+        SshMachineLocation machine = obtainMachine([imageDescriptionRegex:imageDescriptionPattern, imageOwner:imageOwner])
         
         LOG.info("Provisioned AWS vm $machine; checking if ssh'able")
         assertTrue machine.isSshable()


[18/50] brooklyn-server git commit: DynamicCluster.quarantine: review comments

Posted by he...@apache.org.
DynamicCluster.quarantine: review comments

- adds javadoc
- improves config key description

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

Branch: refs/heads/0.6.0
Commit: 0bcb74468e8a74afbcde9e46fda1ec9943c8ea8e
Parents: 5decba3
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 7 12:04:43 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 7 12:04:43 2013 +0000

----------------------------------------------------------------------
 .../java/brooklyn/entity/group/DynamicCluster.java     | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0bcb7446/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
index 2cd4b48..9b0a307 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
@@ -39,6 +39,17 @@ import com.google.common.collect.Multimap;
 
 /**
  * A cluster of entities that can dynamically increase or decrease the number of entities.
+ * 
+ * When quarantine is enabled:
+ * <ul
+ *   <li> The DynamicCluster will have a child entity named "quarantine", which is a group for nodes that failed to start correctly.
+ *   <li> The DynamicCluster's other children will be all nodes in the cluster (that have not been unmanaged/deleted).
+ *   <li> The DynamicCluster's members will be all live nodes in the cluster.
+ *   <li> The Quarantine group's members will be all problem nodes (all nodes that failed to start correctly)
+ * </ul> 
+ * 
+ * When quarantine is disabled, the DynamicCluster will not have a "quarantine" child. Nodes that fail to start will be 
+ * removed from the cluster (i.e. stopped and deleted).
  */
 @ImplementedBy(DynamicClusterImpl.class)
 public interface DynamicCluster extends AbstractGroup, Cluster {
@@ -62,7 +73,7 @@ public interface DynamicCluster extends AbstractGroup, Cluster {
 
     @SetFromFlag("quarantineFailedEntities")
     public static final ConfigKey<Boolean> QUARANTINE_FAILED_ENTITIES = new BasicConfigKey<Boolean>(
-            Boolean.class, "dynamiccluster.quarantineFailedEntities", "Whether to quarantine entities that fail to start, or to try to clean them up", true);
+            Boolean.class, "dynamiccluster.quarantineFailedEntities", "If true, will quarantine entities that fail to start; if false, will get rid of them (i.e. delete them)", true);
 
     public static final AttributeSensor<Lifecycle> SERVICE_STATE = Attributes.SERVICE_STATE;
 


[09/50] brooklyn-server git commit: EnricherSpec: Incorporate review comments

Posted by he...@apache.org.
EnricherSpec: Incorporate review comments


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

Branch: refs/heads/0.6.0
Commit: 0e74b122371cc4ebbccc77eaa6d91e7ccb4b70e8
Parents: b8216c5
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 5 13:05:10 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 5 13:05:48 2013 +0000

----------------------------------------------------------------------
 .../src/main/java/brooklyn/enricher/basic/AbstractEnricher.java | 5 -----
 core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java  | 2 +-
 2 files changed, 1 insertion(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0e74b122/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java b/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
index cc3f901..892085b 100644
--- a/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
@@ -16,11 +16,6 @@ public abstract class AbstractEnricher extends AbstractEntityAdjunct implements
 
     private final EnricherType enricherType;
     
-    /**
-     * The config values of this entity. Updating this map should be done
-     * via getConfig/setConfig.
-     */
-    
     public AbstractEnricher() {
         this(Maps.newLinkedHashMap());
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0e74b122/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java b/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
index fd82f8e..82b719b 100644
--- a/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
+++ b/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
@@ -8,7 +8,7 @@ import brooklyn.policy.EnricherType;
 import com.google.common.base.Objects;
 
 /**
- * This is the actual type of a policy instance at runtime.
+ * This is the actual type of an enricher instance.
  */
 public class EnricherTypeImpl implements EnricherType {
     private static final long serialVersionUID = 668629178669109738L;


[37/50] brooklyn-server git commit: Set loginUser to ubuntu explicitly for 12.04 AMI

Posted by he...@apache.org.
Set loginUser to ubuntu explicitly for 12.04 AMI


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

Branch: refs/heads/0.6.0
Commit: ab22dec05922c48f9f28ebd1cba19b9080fb10c5
Parents: e74a202
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 15:20:48 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 15:20:48 2013 +0000

----------------------------------------------------------------------
 .../base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ab22dec0/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
index 8bd3061..d515491 100644
--- a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
+++ b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
@@ -71,7 +71,7 @@ public abstract class AbstractEc2LiveTest extends BrooklynMgmtContextTestSupport
     @Test(groups = {"Live"})
     public void test_Ubuntu_12_0() throws Exception {
         // Image: {id=us-east-1/ami-d0f89fb9, providerId=ami-d0f89fb9, name=ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, is64Bit=true}, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, version=20130411.1, status=AVAILABLE[available], loginUser=ubuntu, userMetadata={owner=099720109477, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
-        runTest(ImmutableMap.of("imageId", "us-east-1/ami-d0f89fb9", "hardwareId", SMALL_HARDWARE_ID));
+        runTest(ImmutableMap.of("imageId", "us-east-1/ami-d0f89fb9", "loginUser", "ubuntu", "hardwareId", SMALL_HARDWARE_ID));
     }
 
     @Test(groups = {"Live"})


[45/50] brooklyn-server git commit: Fixed issue that was preventing map markers from appearing during tab-to-tab navigation

Posted by he...@apache.org.
Fixed issue that was preventing map markers from appearing during tab-to-tab navigation


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

Branch: refs/heads/0.6.0
Commit: 9e8df21adc4a7b3a57fd46eb97f87e7bf8b8865a
Parents: b0761ca
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Nov 15 11:25:14 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Nov 15 11:25:14 2013 +0000

----------------------------------------------------------------------
 .../src/main/java/brooklyn/rest/resources/LocationResource.java     | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9e8df21a/usage/rest-server/src/main/java/brooklyn/rest/resources/LocationResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/LocationResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/LocationResource.java
index c72057a..ff8fcba 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/LocationResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/LocationResource.java
@@ -61,6 +61,7 @@ public class LocationResource extends AbstractBrooklynRestResource implements Lo
       for (Map.Entry<Location,Integer> count: counts.entrySet()) {
           Location l = count.getKey();
           Map<String,Object> m = MutableMap.<String,Object>of(
+                  "id", l.getId(),
                   "name", l.getDisplayName(),
                   "leafEntityCount", count.getValue(),
                   "latitude", l.getConfig(LocationConfigKeys.LATITUDE),


[25/50] brooklyn-server git commit: Adds Identifiable interface

Posted by he...@apache.org.
Adds Identifiable interface

- implemented by Entity, Location and EntityAdjunct


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

Branch: refs/heads/0.6.0
Commit: ab357177bfd72287d6d01c14d834c08537936e77
Parents: 8aa09c5
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 12 21:46:07 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 12 21:53:17 2013 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/entity/Entity.java   |  4 +++-
 .../main/java/brooklyn/location/Location.java   |  4 +++-
 .../java/brooklyn/policy/EntityAdjunct.java     |  5 +++-
 .../rebind/persister/XmlMementoSerializer.java  | 25 ++++++--------------
 4 files changed, 17 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ab357177/api/src/main/java/brooklyn/entity/Entity.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/Entity.java b/api/src/main/java/brooklyn/entity/Entity.java
index 9890e64..845be09 100644
--- a/api/src/main/java/brooklyn/entity/Entity.java
+++ b/api/src/main/java/brooklyn/entity/Entity.java
@@ -10,6 +10,7 @@ import brooklyn.config.ConfigKey.HasConfigKey;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.rebind.RebindSupport;
 import brooklyn.entity.rebind.Rebindable;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.event.AttributeSensor;
 import brooklyn.location.Location;
 import brooklyn.management.Task;
@@ -30,10 +31,11 @@ import brooklyn.policy.Policy;
  * 
  * @see brooklyn.entity.basic.AbstractEntity
  */
-public interface Entity extends Rebindable {
+public interface Entity extends Identifiable, Rebindable {
     /**
      * The unique identifier for this entity.
      */
+    @Override
     String getId();
     
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ab357177/api/src/main/java/brooklyn/location/Location.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/location/Location.java b/api/src/main/java/brooklyn/location/Location.java
index 65bf193..0b2da15 100644
--- a/api/src/main/java/brooklyn/location/Location.java
+++ b/api/src/main/java/brooklyn/location/Location.java
@@ -7,6 +7,7 @@ import java.util.Map;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.rebind.RebindSupport;
 import brooklyn.entity.rebind.Rebindable;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.mementos.LocationMemento;
 
 /**
@@ -17,11 +18,12 @@ import brooklyn.mementos.LocationMemento;
  * 
  * Locations may not be {@link Serializable} in subsequent releases!
  */
-public interface Location extends Serializable, Rebindable{
+public interface Location extends Serializable, Identifiable, Rebindable {
 
     /**
      * A unique id for this location.
      */
+    @Override
     String getId();
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ab357177/api/src/main/java/brooklyn/policy/EntityAdjunct.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/EntityAdjunct.java b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
index 0671fde..3368e40 100644
--- a/api/src/main/java/brooklyn/policy/EntityAdjunct.java
+++ b/api/src/main/java/brooklyn/policy/EntityAdjunct.java
@@ -1,13 +1,16 @@
 package brooklyn.policy;
 
+import brooklyn.entity.trait.Identifiable;
+
 /**
  * EntityAdjuncts are supplementary logic that can be attached to Entities, providing sensor enrichment
  * or enabling policy
  */
-public interface EntityAdjunct {
+public interface EntityAdjunct extends Identifiable {
     /**
      * A unique id for this adjunct
      */
+    @Override
     String getId();
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ab357177/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
index 68d8ae1..62a2fc4 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
@@ -13,6 +13,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.rebind.dto.BasicEntityMemento;
 import brooklyn.entity.rebind.dto.BasicLocationMemento;
 import brooklyn.entity.rebind.dto.MutableBrooklynMemento;
+import brooklyn.entity.trait.Identifiable;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicConfigKey;
 import brooklyn.location.Location;
@@ -20,7 +21,6 @@ import brooklyn.policy.EntityAdjunct;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.xstream.XmlSerializer;
 
-import com.google.common.base.Function;
 import com.thoughtworks.xstream.converters.Converter;
 import com.thoughtworks.xstream.converters.MarshallingContext;
 import com.thoughtworks.xstream.converters.UnmarshallingContext;
@@ -46,18 +46,9 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         xstream.alias("location", BasicLocationMemento.class);
         xstream.alias("configKey", BasicConfigKey.class);
         xstream.alias("attributeSensor", BasicAttributeSensor.class);
-        xstream.registerConverter(new ConverterImpl(Location.class, new Function<Location,String>() {
-            @Override public String apply(Location input) {
-                return (input != null) ? input.getId() : null;
-            }}));
-        xstream.registerConverter(new ConverterImpl(Entity.class, new Function<Entity,String>() {
-            @Override public String apply(Entity input) {
-                return (input != null) ? input.getId() : null;
-            }}));
-        xstream.registerConverter(new ConverterImpl(EntityAdjunct.class, new Function<EntityAdjunct,String>() {
-            @Override public String apply(EntityAdjunct input) {
-                return (input != null) ? input.getId() : null;
-            }}));
+        xstream.registerConverter(new ConverterImpl(Location.class));
+        xstream.registerConverter(new ConverterImpl(Entity.class));
+        xstream.registerConverter(new ConverterImpl(EntityAdjunct.class));
     }
     
     @Override
@@ -70,14 +61,12 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         }
     }
 
-    public static class ConverterImpl<T> implements Converter {
+    public static class ConverterImpl<T extends Identifiable> implements Converter {
         private final AtomicBoolean hasWarned = new AtomicBoolean(false);
         private final Class<?> converatable;
-        private final Function<T,String> idExtractor;
         
-        ConverterImpl(Class<T> converatable, Function<T,String> idExtractor) {
+        ConverterImpl(Class<T> converatable) {
             this.converatable = checkNotNull(converatable, "converatable");
-            this.idExtractor = checkNotNull(idExtractor, "idExtractor");
         }
         
         @SuppressWarnings({ "rawtypes" })
@@ -98,7 +87,7 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
             }
             // no-op; can't marshall this; deserializing will give null!
             writer.startNode("unserializableLocation");
-            writer.setValue(idExtractor.apply((T)source));
+            writer.setValue(((T)source).getId());
             writer.endNode();
         }
 


[03/50] brooklyn-server git commit: Added whirr-elasticsearch dependency to hadoop-and-whirr example pom and test dependency to whirr/base/pom

Posted by he...@apache.org.
Added whirr-elasticsearch dependency to hadoop-and-whirr example pom and test dependency to whirr/base/pom


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

Branch: refs/heads/0.6.0
Commit: 87f47cf2f7ea361a78300d1d0a04e05d335c8aa4
Parents: 233c2a2
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Nov 1 15:56:13 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Nov 1 15:56:13 2013 +0000

----------------------------------------------------------------------
 systems/whirr/base/pom.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/87f47cf2/systems/whirr/base/pom.xml
----------------------------------------------------------------------
diff --git a/systems/whirr/base/pom.xml b/systems/whirr/base/pom.xml
index 9e51283..4dc3ea5 100644
--- a/systems/whirr/base/pom.xml
+++ b/systems/whirr/base/pom.xml
@@ -147,6 +147,11 @@
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.whirr</groupId>
+            <artifactId>whirr-elasticsearch</artifactId>
+            <version>${whirr.version}</version>
+            <scope>test</scope>
     </dependencies>
 
 </project>


[08/50] brooklyn-server git commit: Enricher: add getConfig()

Posted by he...@apache.org.
Enricher: add getConfig()


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

Branch: refs/heads/0.6.0
Commit: 9f591ed57450a504d6578996a2bae8b3c443f7e7
Parents: 67c7fe5
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 4 23:15:53 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 5 13:05:47 2013 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/policy/Enricher.java |  31 ++-
 .../enricher/basic/AbstractEnricher.java        |  41 ++--
 .../policy/basic/AbstractEntityAdjunct.java     | 198 ++++++++++++++++++-
 .../brooklyn/policy/basic/AbstractPolicy.java   | 156 +--------------
 .../java/brooklyn/policy/basic/AdjunctType.java | 156 +++++++++++++++
 .../brooklyn/policy/basic/ConfigMapImpl.java    | 173 ++++++++++++++++
 .../brooklyn/policy/basic/EnricherTypeImpl.java |  57 ++++++
 .../brooklyn/policy/basic/PolicyConfigMap.java  | 141 +------------
 .../brooklyn/policy/basic/PolicyTypeImpl.java   | 123 ++----------
 .../policy/basic/EnricherConfigTest.java        | 167 ++++++++++++++++
 .../brooklyn/policy/basic/EnricherTypeTest.java |  41 ++++
 11 files changed, 857 insertions(+), 427 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/api/src/main/java/brooklyn/policy/Enricher.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/Enricher.java b/api/src/main/java/brooklyn/policy/Enricher.java
index 8be7c2f..ab6b546 100644
--- a/api/src/main/java/brooklyn/policy/Enricher.java
+++ b/api/src/main/java/brooklyn/policy/Enricher.java
@@ -1,10 +1,39 @@
 package brooklyn.policy;
 
+import java.util.Map;
+
+import brooklyn.config.ConfigKey;
+
+import com.google.common.annotations.Beta;
+
 /**
  * Publishes metrics for an entity, e.g. aggregating information from other sensors/entities.
  * 
  * Has some similarities to {@link Policy}. However, enrichers specifically do not invoke 
- * Effectors and should only function to publish new metrics
+ * effectors and should only function to publish new metrics.
  */
 public interface Enricher extends EntityAdjunct {
+    /**
+     * A unique id for this enricher.
+     */
+    @Override
+    String getId();
+
+    /**
+     * Get the name assigned to this enricher.
+     */
+    @Override
+    String getName();
+
+    /**
+     * Information about the type of this entity; analogous to Java's object.getClass.
+     */
+    @Beta
+    EnricherType getEnricherType();
+
+    <T> T getConfig(ConfigKey<T> key);
+    
+    <T> T setConfig(ConfigKey<T> key, T val);
+    
+    Map<ConfigKey<?>, Object> getAllConfig();
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java b/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
index f101603..cc3f901 100644
--- a/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
+++ b/core/src/main/java/brooklyn/enricher/basic/AbstractEnricher.java
@@ -3,10 +3,10 @@ package brooklyn.enricher.basic;
 import java.util.Map;
 
 import brooklyn.policy.Enricher;
+import brooklyn.policy.EnricherType;
 import brooklyn.policy.basic.AbstractEntityAdjunct;
-import brooklyn.util.flags.FlagUtils;
+import brooklyn.policy.basic.EnricherTypeImpl;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
 
 /**
@@ -14,37 +14,24 @@ import com.google.common.collect.Maps;
 */
 public abstract class AbstractEnricher extends AbstractEntityAdjunct implements Enricher {
 
-    protected Map leftoverProperties = Maps.newLinkedHashMap();
-
+    private final EnricherType enricherType;
+    
+    /**
+     * The config values of this entity. Updating this map should be done
+     * via getConfig/setConfig.
+     */
+    
     public AbstractEnricher() {
         this(Maps.newLinkedHashMap());
     }
     
     public AbstractEnricher(Map flags) {
-        configure(flags);
-        FlagUtils.checkRequiredFields(this);
+        super(flags);
+        enricherType = new EnricherTypeImpl(getAdjunctType());
     }
     
-    /** will set fields from flags, and put the remaining ones into the 'leftovers' map.
-     * can be subclassed for custom initialization but note the following.
-     * <p>
-     * if you require fields to be initialized you must do that in this method. You must
-     * *not* rely on field initializers because they may not run until *after* this method
-     * (this method is invoked by the constructor in this class, so initializers
-     * in subclasses will not have run when this overridden method is invoked.) */
-    protected void configure(Map properties) {
-        leftoverProperties.putAll(FlagUtils.setFieldsFromFlags(properties, this));
-        //replace properties _contents_ with leftovers so subclasses see leftovers only
-        properties.clear();
-        properties.putAll(leftoverProperties);
-        leftoverProperties = properties;
-        
-        if (name == null && properties.containsKey("displayName")) {
-            //'displayName' is a legacy way to refer to a location's name
-            //FIXME could this be a GString?
-            Object displayName = properties.get("displayName");
-            Preconditions.checkArgument(displayName instanceof CharSequence, "'displayName' property should be a string");
-            name = displayName.toString();
-        }
+    @Override
+    public EnricherType getEnricherType() {
+        return enricherType;
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index 996f610..df1409c 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -1,28 +1,66 @@
 package brooklyn.policy.basic;
 
+import static brooklyn.util.GroovyJavaMethods.truth;
+
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.config.ConfigMap;
 import brooklyn.entity.Entity;
 import brooklyn.entity.Group;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.proxying.InternalPolicyFactory;
+import brooklyn.entity.trait.Configurable;
 import brooklyn.event.Sensor;
 import brooklyn.event.SensorEventListener;
+import brooklyn.management.ExecutionContext;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.SubscriptionContext;
 import brooklyn.management.SubscriptionHandle;
 import brooklyn.management.internal.SubscriptionTracker;
 import brooklyn.policy.EntityAdjunct;
+import brooklyn.util.config.ConfigBag;
+import brooklyn.util.flags.FlagUtils;
 import brooklyn.util.flags.SetFromFlag;
+import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.text.Identifiers;
 
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+
 
 /**
  * Common functionality for policies and enrichers
  */
-public abstract class AbstractEntityAdjunct implements EntityAdjunct {
+public abstract class AbstractEntityAdjunct implements EntityAdjunct, Configurable {
+    private static final Logger log = LoggerFactory.getLogger(AbstractEntityAdjunct.class);
+
+    private volatile ManagementContext managementContext;
+    protected Map leftoverProperties = Maps.newLinkedHashMap();
+
+    private boolean _legacyConstruction;
+    private boolean inConstruction;
+
+    protected transient ExecutionContext execution;
+
+    /**
+     * The config values of this entity. Updating this map should be done
+     * via getConfig/setConfig.
+     */
+    protected final ConfigMapImpl configsInternal = new ConfigMapImpl(this);
+
+    protected final AdjunctType adjunctType = new AdjunctType(this);
+
     @SetFromFlag
     protected String id = Identifiers.makeRandomId(8);
     
@@ -30,17 +68,162 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct {
     protected String name;
     
     protected transient EntityLocal entity;
+    
     /** not for direct access; refer to as 'subscriptionTracker' via getter so that it is initialized */
     protected transient SubscriptionTracker _subscriptionTracker;
+    
     private AtomicBoolean destroyed = new AtomicBoolean(false);
 
+    public AbstractEntityAdjunct() {
+        this(Collections.emptyMap());
+    }
+    
+    public AbstractEntityAdjunct(Map flags) {
+        inConstruction = true;
+        _legacyConstruction = !InternalPolicyFactory.FactoryConstructionTracker.isConstructing();
+        if (!_legacyConstruction && flags!=null && !flags.isEmpty()) {
+            log.debug("Using direct construction for "+getClass().getName()+" because properties were specified ("+flags+")");
+            _legacyConstruction = true;
+        }
+        
+        if (_legacyConstruction) {
+            log.debug("Using direct construction for "+getClass().getName()+"; calling configure(Map) immediately");
+            
+            configure(flags);
+            
+            boolean deferConstructionChecks = (flags.containsKey("deferConstructionChecks") && TypeCoercions.coerce(flags.get("deferConstructionChecks"), Boolean.class));
+            if (!deferConstructionChecks) {
+                FlagUtils.checkRequiredFields(this);
+            }
+        }
+        
+        inConstruction = false;
+    }
+
+    /** will set fields from flags, and put the remaining ones into the 'leftovers' map.
+     * can be subclassed for custom initialization but note the following. 
+     * <p>
+     * if you require fields to be initialized you must do that in this method. You must
+     * *not* rely on field initializers because they may not run until *after* this method
+     * (this method is invoked by the constructor in this class, so initializers
+     * in subclasses will not have run when this overridden method is invoked.) */ 
+    protected void configure() {
+        configure(Collections.emptyMap());
+    }
+    
+    @SuppressWarnings("unchecked")
+    public void configure(Map flags) {
+        // TODO only set on first time through
+        boolean isFirstTime = true;
+        
+        // allow config keys, and fields, to be set from these flags if they have a SetFromFlag annotation
+        // or if the value is a config key
+        for (Iterator<Map.Entry> iter = flags.entrySet().iterator(); iter.hasNext();) {
+            Map.Entry entry = iter.next();
+            if (entry.getKey() instanceof ConfigKey) {
+                ConfigKey key = (ConfigKey)entry.getKey();
+                if (adjunctType.getConfigKeys().contains(key)) {
+                    setConfig(key, entry.getValue());
+                } else {
+                    log.warn("Unknown configuration key {} for policy {}; ignoring", key, this);
+                    iter.remove();
+                }
+            }
+        }
+
+        // TODO use ConfigBag
+        ConfigBag bag = new ConfigBag().putAll(flags);
+        FlagUtils.setFieldsFromFlags(this, bag, isFirstTime);
+        FlagUtils.setAllConfigKeys(this, bag);
+        leftoverProperties.putAll(bag.getUnusedConfig());
+
+        //replace properties _contents_ with leftovers so subclasses see leftovers only
+        flags.clear();
+        flags.putAll(leftoverProperties);
+        leftoverProperties = flags;
+        
+        if (!truth(name) && flags.containsKey("displayName")) {
+            //TODO inconsistent with entity and location, where name is legacy and displayName is encouraged!
+            //'displayName' is a legacy way to refer to a policy's name
+            Preconditions.checkArgument(flags.get("displayName") instanceof CharSequence, "'displayName' property should be a string");
+            setName(flags.remove("displayName").toString());
+        }
+    }
+    
+    protected boolean isLegacyConstruction() {
+        return _legacyConstruction;
+    }
+    
+    public void setManagementContext(ManagementContext managementContext) {
+        this.managementContext = managementContext;
+    }
+    
+    protected ManagementContext getManagementContext() {
+        return managementContext;
+    }
+
+    /**
+     * Called by framework (in new-style policies where PolicySpec was used) after configuring, setting parent, etc,
+     * but before a reference to this policy is shared.
+     * 
+     * To preserve backwards compatibility for if the policy is constructed directly, one
+     * can call the code below, but that means it will be called after references to this 
+     * policy have been shared with other entities.
+     * <pre>
+     * {@code
+     * if (isLegacyConstruction()) {
+     *     init();
+     * }
+     * }
+     * </pre>
+     */
+    public void init() {
+        // no-op
+    }
+    
+    public <T> T getConfig(ConfigKey<T> key) {
+        return configsInternal.getConfig(key);
+    }
+    
+    public Map<ConfigKey<?>, Object> getAllConfig() {
+        return configsInternal.getAllConfig();
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T setConfig(ConfigKey<T> key, T val) {
+        if (entity != null && isRunning()) {
+            doReconfigureConfig(key, val);
+        }
+        return (T) configsInternal.setConfig(key, val);
+    }
+    
+    // TODO make immutable
+    /** for inspection only */
+    @Beta
+    public ConfigMap getConfigMap() {
+        return configsInternal;
+    }
+    
+    protected <T> void doReconfigureConfig(ConfigKey<T> key, T val) {
+        throw new UnsupportedOperationException("reconfiguring "+key+" unsupported for "+this);
+    }
+    
+    protected AdjunctType getAdjunctType() {
+        return adjunctType;
+    }
+    
+    @Override
     public String getName() { 
         if (name!=null && name.length()>0) return name;
         return getClass().getCanonicalName();
     }
+    
     public void setName(String name) { this.name = name; }
 
+    @Override
     public String getId() { return id; }
+    
     public void setId(String id) { this.id = id; }
  
     public void setEntity(EntityLocal entity) {
@@ -110,11 +293,6 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct {
         return (tracker != null) ? tracker.getAllSubscriptions() : Collections.<SubscriptionHandle>emptyList();
     }
     
-    /** @deprecated since 0.4.0 shouldn't be needed? */
-    protected ManagementContext getManagementContext() {
-        return ((EntityInternal)entity).getManagementContext();
-    }
-    
     /** 
      * Unsubscribes and clears all managed subscriptions; is called by the owning entity when a policy is removed
      * and should always be called by any subclasses overriding this method
@@ -134,4 +312,12 @@ public abstract class AbstractEntityAdjunct implements EntityAdjunct {
     public boolean isRunning() {
         return !isDestroyed();
     }
+    
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(getClass())
+                .add("name", name)
+                .add("running", isRunning())
+                .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/AbstractPolicy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractPolicy.java b/core/src/main/java/brooklyn/policy/basic/AbstractPolicy.java
index 49f5aa2..815dc77 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractPolicy.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractPolicy.java
@@ -1,204 +1,62 @@
 package brooklyn.policy.basic;
 
-import static brooklyn.util.GroovyJavaMethods.truth;
-
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.proxying.InternalPolicyFactory;
 import brooklyn.entity.rebind.BasicPolicyRebindSupport;
 import brooklyn.entity.rebind.RebindSupport;
 import brooklyn.entity.trait.Configurable;
-import brooklyn.management.ExecutionContext;
-import brooklyn.management.ManagementContext;
 import brooklyn.mementos.PolicyMemento;
 import brooklyn.policy.Policy;
 import brooklyn.policy.PolicyType;
-import brooklyn.util.config.ConfigBag;
-import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.flags.TypeCoercions;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
 
 /**
  * Base {@link Policy} implementation; all policies should extend this or its children
  */
 public abstract class AbstractPolicy extends AbstractEntityAdjunct implements Policy, Configurable {
+    @SuppressWarnings("unused")
     private static final Logger log = LoggerFactory.getLogger(AbstractPolicy.class);
 
-    private volatile ManagementContext managementContext;
     protected String policyStatus;
-    protected Map leftoverProperties = Maps.newLinkedHashMap();
     protected AtomicBoolean suspended = new AtomicBoolean(false);
 
-    private boolean _legacyConstruction;
-    private boolean inConstruction;
-
-    protected transient ExecutionContext execution;
-
     /**
      * The config values of this entity. Updating this map should be done
      * via getConfig/setConfig.
      */
-    protected final PolicyConfigMap configsInternal = new PolicyConfigMap(this);
-
-    private final PolicyType policyType = new PolicyTypeImpl(this);
+    private final PolicyType policyType;
     
     public AbstractPolicy() {
         this(Collections.emptyMap());
     }
     
     public AbstractPolicy(Map flags) {
-        inConstruction = true;
-        _legacyConstruction = !InternalPolicyFactory.FactoryConstructionTracker.isConstructing();
-        if (!_legacyConstruction && flags!=null && !flags.isEmpty()) {
-            log.debug("Using direct policy construction for "+getClass().getName()+" because properties were specified ("+flags+")");
-            _legacyConstruction = true;
-        }
-        
-        if (_legacyConstruction) {
-            log.debug("Using direct policy construction for "+getClass().getName()+"; calling configure(Map) immediately");
-            
-            configure(flags);
-            
-            boolean deferConstructionChecks = (flags.containsKey("deferConstructionChecks") && TypeCoercions.coerce(flags.get("deferConstructionChecks"), Boolean.class));
-            if (!deferConstructionChecks) {
-                FlagUtils.checkRequiredFields(this);
-            }
-        }
-        
-        inConstruction = false;
+        super(flags);
+        policyType = new PolicyTypeImpl(getAdjunctType());
     }
 
-    /** will set fields from flags, and put the remaining ones into the 'leftovers' map.
-     * can be subclassed for custom initialization but note the following. 
-     * <p>
-     * if you require fields to be initialized you must do that in this method. You must
-     * *not* rely on field initializers because they may not run until *after* this method
-     * (this method is invoked by the constructor in this class, so initializers
-     * in subclasses will not have run when this overridden method is invoked.) */ 
-    protected void configure() {
-        configure(Collections.emptyMap());
-    }
-    
-    @SuppressWarnings("unchecked")
-    public void configure(Map flags) {
-        // TODO only set on first time through
-        boolean isFirstTime = true;
-        
-        // allow config keys, and fields, to be set from these flags if they have a SetFromFlag annotation
-        // or if the value is a config key
-        for (Iterator<Map.Entry> iter = flags.entrySet().iterator(); iter.hasNext();) {
-            Map.Entry entry = iter.next();
-            if (entry.getKey() instanceof ConfigKey) {
-                ConfigKey key = (ConfigKey)entry.getKey();
-                if (getPolicyType().getConfigKeys().contains(key)) {
-                    setConfig(key, entry.getValue());
-                } else {
-                    log.warn("Unknown configuration key {} for policy {}; ignoring", key, this);
-                    iter.remove();
-                }
-            }
-        }
-
-        // TODO use ConfigBag
-        ConfigBag bag = new ConfigBag().putAll(flags);
-        FlagUtils.setFieldsFromFlags(this, bag, isFirstTime);
-        FlagUtils.setAllConfigKeys(this, bag);
-        leftoverProperties.putAll(bag.getUnusedConfig());
-
-        //replace properties _contents_ with leftovers so subclasses see leftovers only
-        flags.clear();
-        flags.putAll(leftoverProperties);
-        leftoverProperties = flags;
-        
-        if (!truth(name) && flags.containsKey("displayName")) {
-            //TODO inconsistent with entity and location, where name is legacy and displayName is encouraged!
-            //'displayName' is a legacy way to refer to a policy's name
-            Preconditions.checkArgument(flags.get("displayName") instanceof CharSequence, "'displayName' property should be a string");
-            setName(flags.remove("displayName").toString());
-        }
-    }
-    
-    protected boolean isLegacyConstruction() {
-        return _legacyConstruction;
-    }
-    
-    public void setManagementContext(ManagementContext managementContext) {
-        this.managementContext = managementContext;
-    }
-    
-    protected ManagementContext getManagementContext() {
-        return managementContext;
-    }
-
-    /**
-     * Called by framework (in new-style policies where PolicySpec was used) after configuring, setting parent, etc,
-     * but before a reference to this policy is shared.
-     * 
-     * To preserve backwards compatibility for if the policy is constructed directly, one
-     * can call the code below, but that means it will be called after references to this 
-     * policy have been shared with other entities.
-     * <pre>
-     * {@code
-     * if (isLegacyConstruction()) {
-     *     init();
-     * }
-     * }
-     * </pre>
-     */
-    public void init() {
-        // no-op
-    }
-    
-    public <T> T getConfig(ConfigKey<T> key) {
-        return configsInternal.getConfig(key);
-    }
-    
-    public <T> T setConfig(ConfigKey<T> key, T val) {
-        if (entity != null && isRunning()) {
-            doReconfigureConfig(key, val);
-        }
-        return (T) configsInternal.setConfig(key, val);
-    }
-    
-    public Map<ConfigKey<?>, Object> getAllConfig() {
-        return configsInternal.getAllConfig();
-    }
-    
-    // TODO make immutable
-    /** for inspection only */
-    @Beta
-    public PolicyConfigMap getConfigMap() {
-        return configsInternal;
-    }
-    
-    protected <T> void doReconfigureConfig(ConfigKey<T> key, T val) {
-        throw new UnsupportedOperationException("reconfiguring "+key+" unsupported for "+this);
-    }
-    
     @Override
     public PolicyType getPolicyType() {
         return policyType;
     }
 
+    @Override
     public void suspend() {
         suspended.set(true);
     }
 
+    @Override
     public void resume() {
         suspended.set(false);
     }
 
+    @Override
     public boolean isSuspended() {
         return suspended.get();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/AdjunctType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AdjunctType.java b/core/src/main/java/brooklyn/policy/basic/AdjunctType.java
new file mode 100644
index 0000000..43e4b0f
--- /dev/null
+++ b/core/src/main/java/brooklyn/policy/basic/AdjunctType.java
@@ -0,0 +1,156 @@
+package brooklyn.policy.basic;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.config.ConfigKey.HasConfigKey;
+import brooklyn.policy.EntityAdjunct;
+import brooklyn.policy.PolicyType;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Objects;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+
+/**
+ * This is the actual type of a policy instance at runtime.
+ */
+public class AdjunctType implements Serializable {
+    private static final long serialVersionUID = -662979234559595903L;
+
+    private static final Logger LOG = LoggerFactory.getLogger(AdjunctType.class);
+
+    private final String name;
+    private final Map<String, ConfigKey<?>> configKeys;
+    private final Set<ConfigKey<?>> configKeysSet;
+
+    public AdjunctType(AbstractEntityAdjunct adjunct) {
+        this(adjunct.getClass(), adjunct);
+    }
+    
+    protected AdjunctType(Class<? extends EntityAdjunct> clazz) {
+        this(clazz, null);
+    }
+    
+    private AdjunctType(Class<? extends EntityAdjunct> clazz, AbstractEntityAdjunct adjunct) {
+        name = clazz.getCanonicalName();
+        configKeys = Collections.unmodifiableMap(findConfigKeys(clazz, null));
+        configKeysSet = ImmutableSet.copyOf(this.configKeys.values());
+        if (LOG.isTraceEnabled())
+            LOG.trace("Policy {} config keys: {}", name, Joiner.on(", ").join(configKeys.keySet()));
+    }
+    
+    AdjunctType(String name, Map<String, ConfigKey<?>> configKeys) {
+        this.name = name;
+        this.configKeys = ImmutableMap.copyOf(configKeys);
+        this.configKeysSet = ImmutableSet.copyOf(this.configKeys.values());
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+    public Set<ConfigKey<?>> getConfigKeys() {
+        return configKeysSet;
+    }
+    
+    public ConfigKey<?> getConfigKey(String name) {
+        return configKeys.get(name);
+    }
+    
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(name, configKeys);
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (!(obj instanceof PolicyType)) return false;
+        PolicyType o = (PolicyType) obj;
+        
+        return Objects.equal(name, o.getName()) && Objects.equal(getConfigKeys(), o.getConfigKeys());
+    }
+    
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(name)
+                .add("configKeys", configKeys)
+                .toString();
+    }
+    
+    /**
+     * Finds the config keys defined on the entity's class, statics and optionally any non-static (discouraged).
+     */
+    // TODO Remove duplication from EntityDynamicType
+    protected static Map<String,ConfigKey<?>> findConfigKeys(Class<? extends EntityAdjunct> clazz, EntityAdjunct optionalInstance) {
+        try {
+            Map<String,ConfigKey<?>> result = Maps.newLinkedHashMap();
+            Map<String,Field> configFields = Maps.newLinkedHashMap();
+            for (Field f : clazz.getFields()) {
+                boolean isConfigKey = ConfigKey.class.isAssignableFrom(f.getType());
+                if (!isConfigKey) {
+                    if (!HasConfigKey.class.isAssignableFrom(f.getType())) {
+                        // neither ConfigKey nor HasConfigKey
+                        continue;
+                    }
+                }
+                if (!Modifier.isStatic(f.getModifiers())) {
+                    // require it to be static or we have an instance
+                    LOG.warn("Discouraged use of non-static config key "+f+" defined in " + (optionalInstance!=null ? optionalInstance : clazz));
+                    if (optionalInstance==null) continue;
+                }
+                ConfigKey<?> k = isConfigKey ? (ConfigKey<?>) f.get(optionalInstance) : 
+                    ((HasConfigKey<?>)f.get(optionalInstance)).getConfigKey();
+
+                Field alternativeField = configFields.get(k.getName());
+                // Allow overriding config keys (e.g. to set default values) when there is an assignable-from relationship between classes
+                Field definitiveField = alternativeField != null ? inferSubbestField(alternativeField, f) : f;
+                boolean skip = false;
+                if (definitiveField != f) {
+                    // If they refer to the _same_ instance, just keep the one we already have
+                    if (alternativeField.get(optionalInstance) == f.get(optionalInstance)) skip = true;
+                }
+                if (skip) {
+                    //nothing
+                } else if (definitiveField == f) {
+                    result.put(k.getName(), k);
+                    configFields.put(k.getName(), f);
+                } else if (definitiveField != null) {
+                    if (LOG.isDebugEnabled()) LOG.debug("multiple definitions for config key {} on {}; preferring that in sub-class: {} to {}", new Object[] {
+                            k.getName(), optionalInstance!=null ? optionalInstance : clazz, alternativeField, f});
+                } else if (definitiveField == null) {
+                    LOG.warn("multiple definitions for config key {} on {}; preferring {} to {}", new Object[] {
+                            k.getName(), optionalInstance!=null ? optionalInstance : clazz, alternativeField, f});
+                }
+            }
+            
+            return result;
+        } catch (IllegalAccessException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+    
+    /**
+     * Gets the field that is in the sub-class; or null if one field does not come from a sub-class of the other field's class
+     */
+    // TODO Remove duplication from EntityDynamicType
+    private static Field inferSubbestField(Field f1, Field f2) {
+        Class<?> c1 = f1.getDeclaringClass();
+        Class<?> c2 = f2.getDeclaringClass();
+        boolean isSuper1 = c1.isAssignableFrom(c2);
+        boolean isSuper2 = c2.isAssignableFrom(c1);
+        return (isSuper1) ? (isSuper2 ? null : f2) : (isSuper2 ? f1 : null);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/ConfigMapImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/ConfigMapImpl.java b/core/src/main/java/brooklyn/policy/basic/ConfigMapImpl.java
new file mode 100644
index 0000000..fa157ef
--- /dev/null
+++ b/core/src/main/java/brooklyn/policy/basic/ConfigMapImpl.java
@@ -0,0 +1,173 @@
+package brooklyn.policy.basic;
+
+import static brooklyn.util.GroovyJavaMethods.elvis;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.config.ConfigKey.HasConfigKey;
+import brooklyn.entity.basic.ConfigMapViewWithStringKeys;
+import brooklyn.entity.basic.Entities;
+import brooklyn.entity.basic.EntityInternal;
+import brooklyn.entity.basic.EntityLocal;
+import brooklyn.event.basic.StructuredConfigKey;
+import brooklyn.management.ExecutionContext;
+import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.internal.ConfigKeySelfExtracting;
+import brooklyn.util.task.DeferredSupplier;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Maps;
+
+public class ConfigMapImpl implements brooklyn.config.ConfigMap {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigMapImpl.class);
+
+    /** policy against which config resolution / task execution will occur */
+    private final AbstractEntityAdjunct adjunct;
+
+    private final ConfigMapViewWithStringKeys mapViewWithStringKeys = new ConfigMapViewWithStringKeys(this);
+
+    /*
+     * TODO An alternative implementation approach would be to have:
+     *   setParent(Entity o, Map<ConfigKey,Object> inheritedConfig=[:])
+     * The idea is that the parent could in theory decide explicitly what in its config
+     * would be shared.
+     * I (Aled) am undecided as to whether that would be better...
+     * 
+     * (Alex) i lean toward the config key getting to make the decision
+     */
+    /**
+     * Map of configuration information that is defined at start-up time for the entity. These
+     * configuration parameters are shared and made accessible to the "children" of this
+     * entity.
+     */
+    private final Map<ConfigKey<?>,Object> ownConfig = Collections.synchronizedMap(new LinkedHashMap<ConfigKey<?>, Object>());
+
+    public ConfigMapImpl(AbstractEntityAdjunct adjunct) {
+        this.adjunct = Preconditions.checkNotNull(adjunct, "AbstractEntityAdjunct must be specified");
+    }
+
+    /** Expect this to be deleted when {@link PolicyConfigMap} is deleted */
+    @Beta
+    protected AbstractEntityAdjunct getAdjunct() {
+        return adjunct;
+    }
+    
+    @Override
+    public <T> T getConfig(ConfigKey<T> key) {
+        return getConfig(key, null);
+    }
+    
+    @Override
+    public <T> T getConfig(HasConfigKey<T> key) {
+        return getConfig(key.getConfigKey(), null);
+    }
+    
+    @Override
+    public <T> T getConfig(HasConfigKey<T> key, T defaultValue) {
+        return getConfig(key.getConfigKey(), defaultValue);
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T getConfig(ConfigKey<T> key, T defaultValue) {
+        // FIXME What about inherited task in config?!
+        //              alex says: think that should work, no?
+        // FIXME What if someone calls getConfig on a task, before setting parent app?
+        //              alex says: not supported (throw exception, or return the task)
+        
+        // In case this entity class has overridden the given key (e.g. to set default), then retrieve this entity's key
+        // TODO If ask for a config value that's not in our configKeys, should we really continue with rest of method and return key.getDefaultValue?
+        //      e.g. SshBasedJavaAppSetup calls setAttribute(JMX_USER), which calls getConfig(JMX_USER)
+        //           but that example doesn't have a default...
+        ConfigKey<T> ownKey = adjunct!=null ? (ConfigKey<T>)elvis(adjunct.getAdjunctType().getConfigKey(key.getName()), key) : key;
+        
+        // Don't use groovy truth: if the set value is e.g. 0, then would ignore set value and return default!
+        if (ownKey instanceof ConfigKeySelfExtracting) {
+            if (((ConfigKeySelfExtracting<T>)ownKey).isSet(ownConfig)) {
+                // FIXME Should we support config from futures? How to get execution context before setEntity?
+                EntityLocal entity = adjunct.entity;
+                ExecutionContext exec = (entity != null) ? ((EntityInternal)entity).getExecutionContext() : null;
+                return ((ConfigKeySelfExtracting<T>)ownKey).extractValue(ownConfig, exec);
+            }
+        } else {
+            LOG.warn("Config key {} of {} is not a ConfigKeySelfExtracting; cannot retrieve value; returning default", ownKey, this);
+        }
+        return TypeCoercions.coerce((defaultValue != null) ? defaultValue : ownKey.getDefaultValue(), key.getTypeToken());
+    }
+    
+    @Override
+    public Object getRawConfig(ConfigKey<?> key) {
+        if (ownConfig.containsKey(key)) return ownConfig.get(key);
+        return null;
+    }
+    
+    /** returns the config of this policy */
+    @Override
+    public Map<ConfigKey<?>,Object> getAllConfig() {
+        // Don't use ImmutableMap because valide for values to be null
+        return Collections.unmodifiableMap(Maps.newLinkedHashMap(ownConfig));
+    }
+
+    public Object setConfig(ConfigKey<?> key, Object v) {
+        Object val;
+        if ((v instanceof Future) || (v instanceof DeferredSupplier)) {
+            // no coercion for these (coerce on exit)
+            val = v;
+        } else if (key instanceof StructuredConfigKey) {
+            // no coercion for these structures (they decide what to do)
+            val = v;
+        } else {
+            try {
+                val = TypeCoercions.coerce(v, key.getType());
+            } catch (Exception e) {
+                throw new IllegalArgumentException("Cannot coerce or set "+v+" to "+key, e);
+            }
+        }
+        Object oldVal;
+        if (key instanceof StructuredConfigKey) {
+            oldVal = ((StructuredConfigKey)key).applyValueToMap(val, ownConfig);
+        } else {
+            oldVal = ownConfig.put(key, val);
+        }
+        return oldVal;
+    }
+    
+    @Override
+    public ConfigMapImpl submap(Predicate<ConfigKey<?>> filter) {
+        ConfigMapImpl m = new ConfigMapImpl(adjunct);
+        for (Map.Entry<ConfigKey<?>,Object> entry: ownConfig.entrySet())
+            if (filter.apply(entry.getKey()))
+                m.ownConfig.put(entry.getKey(), entry.getValue());
+        return m;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString()+"[own="+Entities.sanitize(ownConfig)+"]";
+    }
+    
+    @Override
+    public Map<String,Object> asMapWithStringKeys() {
+        return mapViewWithStringKeys;
+    }
+
+    @Override
+    public int size() {
+        return ownConfig.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return ownConfig.isEmpty();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java b/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
new file mode 100644
index 0000000..fd82f8e
--- /dev/null
+++ b/core/src/main/java/brooklyn/policy/basic/EnricherTypeImpl.java
@@ -0,0 +1,57 @@
+package brooklyn.policy.basic;
+
+import java.util.Set;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.policy.EnricherType;
+
+import com.google.common.base.Objects;
+
+/**
+ * This is the actual type of a policy instance at runtime.
+ */
+public class EnricherTypeImpl implements EnricherType {
+    private static final long serialVersionUID = 668629178669109738L;
+    
+    private final AdjunctType delegate;
+
+    public EnricherTypeImpl(AdjunctType delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public String getName() {
+        return delegate.getName();
+    }
+    
+    @Override
+    public Set<ConfigKey<?>> getConfigKeys() {
+        return delegate.getConfigKeys();
+    }
+    
+    @Override
+    public ConfigKey<?> getConfigKey(String name) {
+        return delegate.getConfigKey(name);
+    }
+    
+    @Override
+    public int hashCode() {
+        return delegate.hashCode();
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (!(obj instanceof EnricherType)) return false;
+        EnricherType o = (EnricherType) obj;
+        
+        return Objects.equal(getName(), o.getName()) && Objects.equal(getConfigKeys(), o.getConfigKeys());
+    }
+    
+    @Override
+    public String toString() {
+        return Objects.toStringHelper(getName())
+                .add("configKeys", getConfigKeys())
+                .toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/PolicyConfigMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/PolicyConfigMap.java b/core/src/main/java/brooklyn/policy/basic/PolicyConfigMap.java
index 19546b7..4f38d11 100644
--- a/core/src/main/java/brooklyn/policy/basic/PolicyConfigMap.java
+++ b/core/src/main/java/brooklyn/policy/basic/PolicyConfigMap.java
@@ -1,50 +1,19 @@
 package brooklyn.policy.basic;
 
-import static brooklyn.util.GroovyJavaMethods.elvis;
-
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.concurrent.Future;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import brooklyn.config.ConfigKey;
-import brooklyn.config.ConfigKey.HasConfigKey;
-import brooklyn.entity.basic.ConfigMapViewWithStringKeys;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.event.basic.StructuredConfigKey;
-import brooklyn.management.ExecutionContext;
-import brooklyn.util.flags.TypeCoercions;
-import brooklyn.util.internal.ConfigKeySelfExtracting;
-import brooklyn.util.task.DeferredSupplier;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
-import com.google.common.collect.Maps;
-
-@SuppressWarnings("deprecation")
-public class PolicyConfigMap implements brooklyn.config.ConfigMap {
-
-    private static final Logger LOG = LoggerFactory.getLogger(PolicyConfigMap.class);
 
-    /** policy against which config resolution / task execution will occur */
-    private final AbstractPolicy policy;
+/**
+ * @deprecated since 0.6; use {@link ConfigMapImpl} instead.
+ */
+@Deprecated
+public class PolicyConfigMap extends ConfigMapImpl {
 
-    private final ConfigMapViewWithStringKeys mapViewWithStringKeys = new ConfigMapViewWithStringKeys(this);
-
-    /*
-     * TODO An alternative implementation approach would be to have:
-     *   setParent(Entity o, Map<ConfigKey,Object> inheritedConfig=[:])
-     * The idea is that the parent could in theory decide explicitly what in its config
-     * would be shared.
-     * I (Aled) am undecided as to whether that would be better...
-     * 
-     * (Alex) i lean toward the config key getting to make the decision
-     */
     /**
      * Map of configuration information that is defined at start-up time for the entity. These
      * configuration parameters are shared and made accessible to the "children" of this
@@ -52,110 +21,16 @@ public class PolicyConfigMap implements brooklyn.config.ConfigMap {
      */
     private final Map<ConfigKey<?>,Object> ownConfig = Collections.synchronizedMap(new LinkedHashMap<ConfigKey<?>, Object>());
 
-    public PolicyConfigMap(AbstractPolicy policy) {
-        this.policy = Preconditions.checkNotNull(policy, "policy must be specified");
+    public PolicyConfigMap(AbstractEntityAdjunct policy) {
+        super(policy);
     }
 
-    public <T> T getConfig(ConfigKey<T> key) {
-        return getConfig(key, null);
-    }
-    
-    public <T> T getConfig(HasConfigKey<T> key) {
-        return getConfig(key.getConfigKey(), null);
-    }
-    
-    public <T> T getConfig(HasConfigKey<T> key, T defaultValue) {
-        return getConfig(key.getConfigKey(), defaultValue);
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <T> T getConfig(ConfigKey<T> key, T defaultValue) {
-        // FIXME What about inherited task in config?!
-        //              alex says: think that should work, no?
-        // FIXME What if someone calls getConfig on a task, before setting parent app?
-        //              alex says: not supported (throw exception, or return the task)
-        
-        // In case this entity class has overridden the given key (e.g. to set default), then retrieve this entity's key
-        // TODO If ask for a config value that's not in our configKeys, should we really continue with rest of method and return key.getDefaultValue?
-        //      e.g. SshBasedJavaAppSetup calls setAttribute(JMX_USER), which calls getConfig(JMX_USER)
-        //           but that example doesn't have a default...
-        ConfigKey<T> ownKey = policy!=null ? (ConfigKey<T>)elvis(policy.getPolicyType().getConfigKey(key.getName()), key) : key;
-        
-        // Don't use groovy truth: if the set value is e.g. 0, then would ignore set value and return default!
-        if (ownKey instanceof ConfigKeySelfExtracting) {
-            if (((ConfigKeySelfExtracting<T>)ownKey).isSet(ownConfig)) {
-                // FIXME Should we support config from futures? How to get execution context before setEntity?
-                EntityLocal entity = policy.entity;
-                ExecutionContext exec = (entity != null) ? ((EntityInternal)entity).getExecutionContext() : null;
-                return ((ConfigKeySelfExtracting<T>)ownKey).extractValue(ownConfig, exec);
-            }
-        } else {
-            LOG.warn("Config key {} of {} is not a ConfigKeySelfExtracting; cannot retrieve value; returning default", ownKey, this);
-        }
-        return TypeCoercions.coerce((defaultValue != null) ? defaultValue : ownKey.getDefaultValue(), key.getTypeToken());
-    }
-    
-    @Override
-    public Object getRawConfig(ConfigKey<?> key) {
-        if (ownConfig.containsKey(key)) return ownConfig.get(key);
-        return null;
-    }
-    
-    /** returns the config of this policy */
-    public Map<ConfigKey<?>,Object> getAllConfig() {
-        // Don't use ImmutableMap because valide for values to be null
-        return Collections.unmodifiableMap(Maps.newLinkedHashMap(ownConfig));
-    }
-
-    public Object setConfig(ConfigKey<?> key, Object v) {
-        Object val;
-        if ((v instanceof Future) || (v instanceof DeferredSupplier)) {
-            // no coercion for these (coerce on exit)
-            val = v;
-        } else if (key instanceof StructuredConfigKey) {
-            // no coercion for these structures (they decide what to do)
-            val = v;
-        } else {
-            try {
-                val = TypeCoercions.coerce(v, key.getType());
-            } catch (Exception e) {
-                throw new IllegalArgumentException("Cannot coerce or set "+v+" to "+key, e);
-            }
-        }
-        Object oldVal;
-        if (key instanceof StructuredConfigKey) {
-            oldVal = ((StructuredConfigKey)key).applyValueToMap(val, ownConfig);
-        } else {
-            oldVal = ownConfig.put(key, val);
-        }
-        return oldVal;
-    }
-    
     @Override
     public PolicyConfigMap submap(Predicate<ConfigKey<?>> filter) {
-        PolicyConfigMap m = new PolicyConfigMap(policy);
+        PolicyConfigMap m = new PolicyConfigMap(getAdjunct());
         for (Map.Entry<ConfigKey<?>,Object> entry: ownConfig.entrySet())
             if (filter.apply(entry.getKey()))
                 m.ownConfig.put(entry.getKey(), entry.getValue());
         return m;
     }
-
-    @Override
-    public String toString() {
-        return super.toString()+"[own="+Entities.sanitize(ownConfig)+"]";
-    }
-    
-    public Map<String,Object> asMapWithStringKeys() {
-        return mapViewWithStringKeys;
-    }
-
-    @Override
-    public int size() {
-        return ownConfig.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return ownConfig.isEmpty();
-    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/main/java/brooklyn/policy/basic/PolicyTypeImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/PolicyTypeImpl.java b/core/src/main/java/brooklyn/policy/basic/PolicyTypeImpl.java
index b1284ac..47ad24c 100644
--- a/core/src/main/java/brooklyn/policy/basic/PolicyTypeImpl.java
+++ b/core/src/main/java/brooklyn/policy/basic/PolicyTypeImpl.java
@@ -1,76 +1,42 @@
 package brooklyn.policy.basic;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.Map;
 import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import brooklyn.config.ConfigKey;
-import brooklyn.config.ConfigKey.HasConfigKey;
-import brooklyn.policy.Policy;
 import brooklyn.policy.PolicyType;
 
-import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
 
 /**
  * This is the actual type of a policy instance at runtime.
  */
 public class PolicyTypeImpl implements PolicyType {
-    private static final long serialVersionUID = -662979234559595903L;
-
-    private static final Logger LOG = LoggerFactory.getLogger(PolicyTypeImpl.class);
-
-    private final String name;
-    private final Map<String, ConfigKey<?>> configKeys;
-    private final Set<ConfigKey<?>> configKeysSet;
-
-    public PolicyTypeImpl(AbstractPolicy policy) {
-        this(policy.getClass(), policy);
-    }
-    protected PolicyTypeImpl(Class<? extends Policy> clazz) {
-        this(clazz, null);
-    }
-    private PolicyTypeImpl(Class<? extends Policy> clazz, AbstractPolicy policy) {
-        name = clazz.getCanonicalName();
-        configKeys = Collections.unmodifiableMap(findConfigKeys(clazz, policy));
-        configKeysSet = ImmutableSet.copyOf(this.configKeys.values());
-        if (LOG.isTraceEnabled())
-            LOG.trace("Policy {} config keys: {}", name, Joiner.on(", ").join(configKeys.keySet()));
-    }
+    private static final long serialVersionUID = -7370390838599315481L;
     
-    PolicyTypeImpl(String name, Map<String, ConfigKey<?>> configKeys) {
-        this.name = name;
-        this.configKeys = ImmutableMap.copyOf(configKeys);
-        this.configKeysSet = ImmutableSet.copyOf(this.configKeys.values());
+    private final AdjunctType delegate;
+
+    public PolicyTypeImpl(AdjunctType delegate) {
+        this.delegate = delegate;
     }
 
     @Override
     public String getName() {
-        return name;
+        return delegate.getName();
     }
     
     @Override
     public Set<ConfigKey<?>> getConfigKeys() {
-        return configKeysSet;
+        return delegate.getConfigKeys();
     }
     
     @Override
     public ConfigKey<?> getConfigKey(String name) {
-        return configKeys.get(name);
+        return delegate.getConfigKey(name);
     }
     
     @Override
     public int hashCode() {
-        return Objects.hashCode(name, configKeys);
+        return delegate.hashCode();
     }
     
     @Override
@@ -79,78 +45,13 @@ public class PolicyTypeImpl implements PolicyType {
         if (!(obj instanceof PolicyType)) return false;
         PolicyType o = (PolicyType) obj;
         
-        return Objects.equal(name, o.getName()) && Objects.equal(getConfigKeys(), o.getConfigKeys());
+        return Objects.equal(getName(), o.getName()) && Objects.equal(getConfigKeys(), o.getConfigKeys());
     }
     
     @Override
     public String toString() {
-        return Objects.toStringHelper(name)
-                .add("configKeys", configKeys)
+        return Objects.toStringHelper(getName())
+                .add("configKeys", getConfigKeys())
                 .toString();
     }
-    
-    /**
-     * Finds the config keys defined on the entity's class, statics and optionally any non-static (discouraged).
-     */
-    // TODO Remove duplication from EntityDynamicType
-    protected static Map<String,ConfigKey<?>> findConfigKeys(Class<? extends Policy> clazz, Policy optionalPolicy) {
-        try {
-            Map<String,ConfigKey<?>> result = Maps.newLinkedHashMap();
-            Map<String,Field> configFields = Maps.newLinkedHashMap();
-            for (Field f : clazz.getFields()) {
-                boolean isConfigKey = ConfigKey.class.isAssignableFrom(f.getType());
-                if (!isConfigKey) {
-                    if (!HasConfigKey.class.isAssignableFrom(f.getType())) {
-                        // neither ConfigKey nor HasConfigKey
-                        continue;
-                    }
-                }
-                if (!Modifier.isStatic(f.getModifiers())) {
-                    // require it to be static or we have an instance
-                    LOG.warn("Discouraged use of non-static config key "+f+" defined in " + (optionalPolicy!=null ? optionalPolicy : clazz));
-                    if (optionalPolicy==null) continue;
-                }
-                ConfigKey<?> k = isConfigKey ? (ConfigKey<?>) f.get(optionalPolicy) : 
-                    ((HasConfigKey<?>)f.get(optionalPolicy)).getConfigKey();
-
-                Field alternativeField = configFields.get(k.getName());
-                // Allow overriding config keys (e.g. to set default values) when there is an assignable-from relationship between classes
-                Field definitiveField = alternativeField != null ? inferSubbestField(alternativeField, f) : f;
-                boolean skip = false;
-                if (definitiveField != f) {
-                    // If they refer to the _same_ instance, just keep the one we already have
-                    if (alternativeField.get(optionalPolicy) == f.get(optionalPolicy)) skip = true;
-                }
-                if (skip) {
-                    //nothing
-                } else if (definitiveField == f) {
-                    result.put(k.getName(), k);
-                    configFields.put(k.getName(), f);
-                } else if (definitiveField != null) {
-                    if (LOG.isDebugEnabled()) LOG.debug("multiple definitions for config key {} on {}; preferring that in sub-class: {} to {}", new Object[] {
-                            k.getName(), optionalPolicy!=null ? optionalPolicy : clazz, alternativeField, f});
-                } else if (definitiveField == null) {
-                    LOG.warn("multiple definitions for config key {} on {}; preferring {} to {}", new Object[] {
-                            k.getName(), optionalPolicy!=null ? optionalPolicy : clazz, alternativeField, f});
-                }
-            }
-            
-            return result;
-        } catch (IllegalAccessException e) {
-            throw Throwables.propagate(e);
-        }
-    }
-    
-    /**
-     * Gets the field that is in the sub-class; or null if one field does not come from a sub-class of the other field's class
-     */
-    // TODO Remove duplication from EntityDynamicType
-    private static Field inferSubbestField(Field f1, Field f2) {
-        Class<?> c1 = f1.getDeclaringClass();
-        Class<?> c2 = f2.getDeclaringClass();
-        boolean isSuper1 = c1.isAssignableFrom(c2);
-        boolean isSuper2 = c2.isAssignableFrom(c1);
-        return (isSuper1) ? (isSuper2 ? null : f2) : (isSuper2 ? f1 : null);
-    }
-    
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/test/java/brooklyn/policy/basic/EnricherConfigTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/policy/basic/EnricherConfigTest.java b/core/src/test/java/brooklyn/policy/basic/EnricherConfigTest.java
new file mode 100644
index 0000000..35945ba
--- /dev/null
+++ b/core/src/test/java/brooklyn/policy/basic/EnricherConfigTest.java
@@ -0,0 +1,167 @@
+package brooklyn.policy.basic;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.fail;
+
+import java.util.Map;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.config.ConfigKey;
+import brooklyn.enricher.basic.AbstractEnricher;
+import brooklyn.entity.basic.ApplicationBuilder;
+import brooklyn.entity.basic.Entities;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.test.entity.TestApplication;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.flags.SetFromFlag;
+
+/**
+ * Test that configuration properties are usable and inherited correctly.
+ */
+public class EnricherConfigTest {
+    
+    // TODO These tests are a copy of PolicyConfigMapUsageTest, which is a code smell.
+    // However, the src/main/java code does not contain as much duplication.
+    
+    public static class MyEnricher extends AbstractEnricher {
+        @SetFromFlag("intKey")
+        public static final BasicConfigKey<Integer> INT_KEY = new BasicConfigKey<Integer>(Integer.class, "bkey", "b key");
+        
+        @SetFromFlag("strKey")
+        public static final ConfigKey<String> STR_KEY = new BasicConfigKey<String>(String.class, "akey", "a key");
+        public static final ConfigKey<Integer> INT_KEY_WITH_DEFAULT = new BasicConfigKey<Integer>(Integer.class, "ckey", "c key", 1);
+        public static final ConfigKey<String> STR_KEY_WITH_DEFAULT = new BasicConfigKey<String>(String.class, "strKey", "str key", "str key default");
+        
+        MyEnricher(Map flags) {
+            super(flags);
+        }
+        
+        MyEnricher() {
+            super();
+        }
+    }
+    
+    private BasicConfigKey<String> differentKey = new BasicConfigKey<String>(String.class, "differentkey", "diffval");
+
+    private TestApplication app;
+    
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() {
+        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+    }
+    
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        if (app != null) Entities.destroyAll(app.getManagementContext());
+    }
+    
+    @Test
+    public void testConfigFlagsPassedInAtConstructionIsAvailable() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put("strKey", "aval")
+                .put("intKey", 2)
+                .build());
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "aval");
+        assertEquals(enricher.getConfig(MyEnricher.INT_KEY), (Integer)2);
+        // this is set, because key name matches annotation on STR_KEY
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), "aval");
+    }
+    
+    @Test
+    public void testUnknownConfigPassedInAtConstructionIsWarnedAndIgnored() throws Exception {
+        // TODO Also assert it's warned
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(differentKey, "aval")
+                .build());
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(differentKey), null);
+        assertEquals(enricher.getEnricherType().getConfigKey(differentKey.getName()), null);
+    }
+    
+    @Test
+    public void testConfigPassedInAtConstructionIsAvailable() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(MyEnricher.STR_KEY, "aval")
+                .put(MyEnricher.INT_KEY, 2)
+                .build());
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "aval");
+        assertEquals(enricher.getConfig(MyEnricher.INT_KEY), (Integer)2);
+        // this is not set (contrast with above)
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), MyEnricher.STR_KEY_WITH_DEFAULT.getDefaultValue());
+    }
+    
+    @Test
+    public void testConfigSetToGroovyTruthFalseIsAvailable() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(MyEnricher.INT_KEY_WITH_DEFAULT, 0)
+                .build());
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.INT_KEY_WITH_DEFAULT), (Integer)0);
+    }
+    
+    @Test
+    public void testConfigSetToNullIsAvailable() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(MyEnricher.STR_KEY_WITH_DEFAULT, null)
+                .build());
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), null);
+    }
+    
+    @Test
+    public void testConfigCanBeSetOnEnricher() throws Exception {
+        MyEnricher enricher = new MyEnricher();
+        enricher.setConfig(MyEnricher.STR_KEY, "aval");
+        enricher.setConfig(MyEnricher.INT_KEY, 2);
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "aval");
+        assertEquals(enricher.getConfig(MyEnricher.INT_KEY), (Integer)2);
+    }
+    
+    @Test
+    public void testConfigSetterOverridesConstructorValue() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(MyEnricher.STR_KEY, "aval")
+                .build());
+        enricher.setConfig(MyEnricher.STR_KEY, "diffval");
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "diffval");
+    }
+
+    @Test
+    public void testConfigCannotBeSetAfterApplicationIsStarted() throws Exception {
+        MyEnricher enricher = new MyEnricher(MutableMap.builder()
+                .put(MyEnricher.STR_KEY, "origval")
+                .build());
+        app.addEnricher(enricher);
+        
+        try {
+            enricher.setConfig(MyEnricher.STR_KEY,"newval");
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // success
+        }
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY), "origval");
+    }
+    
+    @Test
+    public void testConfigReturnsDefaultValueIfNotSet() throws Exception {
+        MyEnricher enricher = new MyEnricher();
+        app.addEnricher(enricher);
+        
+        assertEquals(enricher.getConfig(MyEnricher.STR_KEY_WITH_DEFAULT), "str key default");
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9f591ed5/core/src/test/java/brooklyn/policy/basic/EnricherTypeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/policy/basic/EnricherTypeTest.java b/core/src/test/java/brooklyn/policy/basic/EnricherTypeTest.java
new file mode 100644
index 0000000..af3d44d
--- /dev/null
+++ b/core/src/test/java/brooklyn/policy/basic/EnricherTypeTest.java
@@ -0,0 +1,41 @@
+package brooklyn.policy.basic;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import brooklyn.enricher.basic.AbstractEnricher;
+import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.policy.EnricherType;
+
+import com.google.common.collect.ImmutableSet;
+
+public class EnricherTypeTest {
+    private MyEnricher enricher;
+    
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception{
+        enricher = new MyEnricher();
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        // nothing to tear down; no management context not started
+    }
+    
+    @Test
+    public void testGetConfig() throws Exception {
+        EnricherType enricherType = enricher.getEnricherType();
+        assertEquals(enricherType.getConfigKeys(), ImmutableSet.of(MyEnricher.CONF1, MyEnricher.CONF2));
+        assertEquals(enricherType.getName(), MyEnricher.class.getCanonicalName());
+        assertEquals(enricherType.getConfigKey("test.conf1"), MyEnricher.CONF1);
+        assertEquals(enricherType.getConfigKey("test.conf2"), MyEnricher.CONF2);
+    }
+    
+    public static class MyEnricher extends AbstractEnricher {
+        public static final BasicConfigKey<String> CONF1 = new BasicConfigKey<String>(String.class, "test.conf1", "my descr, conf1", "defaultval1");
+        public static final BasicConfigKey<Integer> CONF2 = new BasicConfigKey<Integer>(Integer.class, "test.conf2", "my descr, conf2", 2);
+    }
+}


[20/50] brooklyn-server git commit: Switch to rolling logs

Posted by he...@apache.org.
Switch to rolling logs


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

Branch: refs/heads/0.6.0
Commit: 76fadda53ceb4f2e7a9d7dce4eff4e2df1aa5857
Parents: 69fd8d5
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Tue Nov 12 13:04:41 2013 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Tue Nov 12 16:08:45 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/logback-appender-file.xml          | 41 +++++++++++++++++++-
 .../brooklyn/logback-appender-file.xml          |  1 -
 2 files changed, 39 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/76fadda5/usage/logback-includes/src/main/resources/brooklyn/logback-appender-file.xml
----------------------------------------------------------------------
diff --git a/usage/logback-includes/src/main/resources/brooklyn/logback-appender-file.xml b/usage/logback-includes/src/main/resources/brooklyn/logback-appender-file.xml
index 0a49cab..675ffaa 100644
--- a/usage/logback-includes/src/main/resources/brooklyn/logback-appender-file.xml
+++ b/usage/logback-includes/src/main/resources/brooklyn/logback-appender-file.xml
@@ -1,15 +1,52 @@
 <included>
 
-  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-    <file>${logging.dir:-./}${logging.basename:-brooklyn}.log</file>
+  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logging.dir:-./}${logging.basename:-brooklyn}.debug.log</file>
     <append>true</append>
     <encoder>
       <pattern>%d %-5level %logger{30} [%thread{15}]: %msg%n</pattern>
     </encoder>
+
+    <!-- Truncate log at 100 MB, max history of 10 -->
+    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logging.dir:-./}${logging.basename:-brooklyn}.debug-%i.log.zip</fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>10</maxIndex>
+    </rollingPolicy>
+
+    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>100MB</maxFileSize>
+    </triggeringPolicy>
   </appender>
 
+  <!-- create a separate info log which will let us see a much longer history
+       (debug logs may hit their 10x 100MB limit much sooner!) -->
+  <appender name="INFO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logging.dir:-./}${logging.basename:-brooklyn}.info.log</file>
+    <append>true</append>
+    <encoder>
+      <pattern>%d %-5level %logger{30} [%thread{15}]: %msg%n</pattern>
+    </encoder>
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+        <level>INFO</level>
+    </filter>
+
+    <!-- Truncate log at 100 MB, max history of 10 -->
+    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logging.dir:-./}${logging.basename:-brooklyn}.info-%i.log.zip</fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>10</maxIndex>
+    </rollingPolicy>
+
+    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>100MB</maxFileSize>
+    </triggeringPolicy>
+  </appender>
+
+
   <root>
     <appender-ref ref="FILE" />
+    <appender-ref ref="INFO-FILE" />
   </root>
 
 </included>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/76fadda5/utils/test-support/src/main/resources/brooklyn/logback-appender-file.xml
----------------------------------------------------------------------
diff --git a/utils/test-support/src/main/resources/brooklyn/logback-appender-file.xml b/utils/test-support/src/main/resources/brooklyn/logback-appender-file.xml
index 04b12d2..06b87cb 100644
--- a/utils/test-support/src/main/resources/brooklyn/logback-appender-file.xml
+++ b/utils/test-support/src/main/resources/brooklyn/logback-appender-file.xml
@@ -1,4 +1,3 @@
-
 <included>
 
   <appender name="FILE" class="ch.qos.logback.core.FileAppender">


[12/50] brooklyn-server git commit: Merge pull request #996 from ahgittin/misc

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

more useful sample "brooklyn.properties" plus very minor code/javadoc tidies

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

Branch: refs/heads/0.6.0
Commit: 3412487784476a38202824072837c99492204541
Parents: 358c13e 12b1678
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 5 06:38:50 2013 -0800
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 5 06:38:50 2013 -0800

----------------------------------------------------------------------
 api/src/main/java/brooklyn/location/LocationRegistry.java        | 2 ++
 .../src/main/java/brooklyn/event/feed/function/FunctionFeed.java | 4 ++++
 .../java/brooklyn/location/jclouds/JcloudsLocationConfig.java    | 2 +-
 3 files changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[11/50] brooklyn-server git commit: minor javadoc addition and usability tweak

Posted by he...@apache.org.
minor javadoc addition and usability tweak


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

Branch: refs/heads/0.6.0
Commit: 12b1678c1b20ed7b5c40f44be272de818bda0096
Parents: 4c24127
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 5 13:01:23 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 5 13:44:11 2013 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/location/LocationRegistry.java        | 2 ++
 .../src/main/java/brooklyn/event/feed/function/FunctionFeed.java | 4 ++++
 .../java/brooklyn/location/jclouds/JcloudsLocationConfig.java    | 2 +-
 3 files changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/12b1678c/api/src/main/java/brooklyn/location/LocationRegistry.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/location/LocationRegistry.java b/api/src/main/java/brooklyn/location/LocationRegistry.java
index 43cb944..5b1d616 100644
--- a/api/src/main/java/brooklyn/location/LocationRegistry.java
+++ b/api/src/main/java/brooklyn/location/LocationRegistry.java
@@ -12,6 +12,8 @@ import java.util.NoSuchElementException;
 @SuppressWarnings("rawtypes")
 public interface LocationRegistry {
 
+    /** map of ID (possibly randomly generated) to the definition (spec, name, id, and props; 
+     * where spec is the spec as defined, for instance possibly another named:xxx location) */
     public Map<String,LocationDefinition> getDefinedLocations();
     
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/12b1678c/core/src/main/java/brooklyn/event/feed/function/FunctionFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/function/FunctionFeed.java b/core/src/main/java/brooklyn/event/feed/function/FunctionFeed.java
index 05cb785..d4c3f7f 100644
--- a/core/src/main/java/brooklyn/event/feed/function/FunctionFeed.java
+++ b/core/src/main/java/brooklyn/event/feed/function/FunctionFeed.java
@@ -15,6 +15,7 @@ import brooklyn.event.feed.AbstractFeed;
 import brooklyn.event.feed.AttributePollHandler;
 import brooklyn.event.feed.DelegatingPollHandler;
 import brooklyn.event.feed.Poller;
+import brooklyn.util.time.Duration;
 
 import com.google.common.base.Objects;
 import com.google.common.collect.HashMultimap;
@@ -76,6 +77,9 @@ public class FunctionFeed extends AbstractFeed {
             this.entity = val;
             return this;
         }
+        public Builder period(Duration d) {
+            return period(d.toMilliseconds(), TimeUnit.MILLISECONDS);
+        }
         public Builder period(long millis) {
             return period(millis, TimeUnit.MILLISECONDS);
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/12b1678c/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
index 4ea8144..c634482 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
@@ -138,7 +138,7 @@ public interface JcloudsLocationConfig extends CloudLocationConfig {
     
     public static final ConfigKey<String> CUSTOM_MACHINE_SETUP_SCRIPT_VARS = ConfigKeys.newStringConfigKey("setup.script.vars", "vars to customize a setup.script i.e.: key1:value1,key2:value2");
     
-    public static final ConfigKey<Boolean> GENERATE_HOSTNAME = new BasicConfigKey<Boolean>(Boolean.class, "generate.hostname", "Use the nodename generated by jclouds ", false);
+    public static final ConfigKey<Boolean> GENERATE_HOSTNAME = new BasicConfigKey<Boolean>(Boolean.class, "generate.hostname", "Use the nodename generated by jclouds", false);
 
     public static final ConfigKey<Integer> MACHINE_CREATE_ATTEMPTS = ConfigKeys.newIntegerConfigKey(
             "machineCreateAttempts", "Number of times to retry if jclouds fails to create a VM", 1);


[49/50] brooklyn-server git commit: Avoid NPE in toMetadataRecord for jclouds machine

Posted by he...@apache.org.
Avoid NPE in toMetadataRecord for jclouds machine

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

Branch: refs/heads/0.6.0
Commit: 2863788cf689ae2cf8e678a15fe28cf27c371dd6
Parents: bb96f77
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 18 13:30:46 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 18 13:30:46 2013 +0000

----------------------------------------------------------------------
 .../location/jclouds/JcloudsSshMachineLocation.java   | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2863788c/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
index d23ca8c..282a37f 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsSshMachineLocation.java
@@ -5,6 +5,7 @@ import static brooklyn.util.GroovyJavaMethods.truth;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -15,7 +16,9 @@ import javax.annotation.Nullable;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.callables.RunScriptOnNode;
 import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Processor;
 import org.jclouds.compute.options.RunScriptOptions;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.scriptbuilder.domain.InterpretableStatement;
@@ -209,16 +212,19 @@ public class JcloudsSshMachineLocation extends SshMachineLocation implements Has
     
     @Override
     public Map<String, String> toMetadataRecord() {
+        Hardware hardware = node.getHardware();
+        List<? extends Processor> processors = (hardware != null) ? hardware.getProcessors() : null;
+        
         ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
         builder.putAll(super.toMetadataRecord());
         putIfNotNull(builder, "provider", getParent().getProvider());
         putIfNotNull(builder, "account", getParent().getIdentity());
         putIfNotNull(builder, "serverId", node.getProviderId());
         putIfNotNull(builder, "imageId", node.getImageId());
-        putIfNotNull(builder, "instanceTypeName", node.getHardware().getName());
-        putIfNotNull(builder, "instanceTypeId", node.getHardware().getProviderId());
-        putIfNotNull(builder, "ram", "" + node.getHardware().getRam());
-        putIfNotNull(builder, "cpus", "" + node.getHardware().getProcessors().size());
+        putIfNotNull(builder, "instanceTypeName", (hardware != null ? hardware.getName() : null));
+        putIfNotNull(builder, "instanceTypeId", (hardware != null ? hardware.getProviderId() : null));
+        putIfNotNull(builder, "ram", "" + (hardware != null ? hardware.getRam() : null));
+        putIfNotNull(builder, "cpus", "" + (processors != null ? processors.size() : null));
         putIfNotNull(builder, "osName", getOsDetails().getName());
         putIfNotNull(builder, "osArch", getOsDetails().getArch());
         putIfNotNull(builder, "64bit", getOsDetails().is64bit() ? "true" : "false");


[10/50] brooklyn-server git commit: Merge branch 'master' of github.com:grkvlt/brooklyn-central into feature/resourceutils-static

Posted by he...@apache.org.
Merge branch 'master' of github.com:grkvlt/brooklyn-central into feature/resourceutils-static

* 'master' of github.com:grkvlt/brooklyn-central: (37 commits)
  Replaced erroneous magic number with constant
  Fixed indentation following PR comments
  Changed pubsub message text to be in line with new Subscribe output
  Update following PR comments
  Fixed addition of elasticsearch dependency that had broken whirr/base/pom.xml
  Fixed another reference to StandaloneBrokerExample vs StandaloneQpidBrokerExample
  Fixed issue that mean example subscriber would quit after 101 messages, not 100
  Added message to the example message subscriber to clarify why it run, then quit
  Added call to super.connectSensors() in QpidBrokerImpl (its ommission meant the BROKER_URL sensor was never set)
  Updated example text to use same classname as provided class
  Updated whirr example to add whirr-elasticsearch jar to BROOKLYN_CLASSPATH and added note about including whirr-elasticsearch as a dependency
  Added whirr-elasticsearch dependency to hadoop-and-whirr example pom and test dependency to whirr/base/pom
  Updated screenshots in whirr hadoop example
  Fixed typo in whirrhadoop example
  Added explicit call to Entities.manage() for whirr entities (fixes entity display issue in web console)
  Added version-specific dependency for jclouds-enterprise (required by whirr)
  Update WideAreaCassandraCluster.java
  Update HighAvailabilityCassandraCluster.java
  fix test for removal of delete button from home page js gui
  tweak web example sql so it is more portable
  ...

Conflicts:
	examples/simple-nosql-cluster/src/main/java/brooklyn/demo/CumulusRDFApplication.java


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

Branch: refs/heads/0.6.0
Commit: 358c13e56f104b03bb74919804a1e3d118407665
Parents: 3fb845b 1ed1f10
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Nov 5 13:09:12 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Tue Nov 5 13:09:12 2013 +0000

----------------------------------------------------------------------
 .../entity/group/DynamicClusterImpl.java        |  8 +++---
 .../location/basic/SshMachineLocation.java      | 28 ++++++++++++--------
 .../main/resources/visitors-creation-script.sql | 10 +++++--
 locations/jclouds/pom.xml                       |  2 +-
 .../brooklyn/location-metadata.properties       |  4 +--
 pom.xml                                         |  2 +-
 .../test/resources/visitors-creation-script.sql | 10 +++++--
 .../entity/basic/SoftwareProcessImpl.java       |  2 +-
 .../entity/chef/ChefLifecycleEffectorTasks.java | 13 ++++++++-
 systems/whirr/base/pom.xml                      | 11 ++++++++
 .../extras/whirr/core/WhirrClusterImpl.java     |  6 +++--
 .../brooklyn/util/collections/MutableMap.java   |  7 +++--
 12 files changed, 75 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/358c13e5/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
----------------------------------------------------------------------
diff --cc core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
index 58804e9,e56e962..1643665
--- a/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/SshMachineLocation.java
@@@ -624,15 -626,17 +624,17 @@@ public class SshMachineLocation extend
  
      /**
       * @see #obtainPort(PortRange)
 -     * @see BasicPortRange#ANY_HIGH_PORT
 +     * @see PortRanges#ANY_HIGH_PORT
       */
      public boolean obtainSpecificPort(int portNumber) {
- 	    // TODO Does not yet check if the port really is free on this machine
-         if (usedPorts.contains(portNumber)) {
-             return false;
-         } else {
-             usedPorts.add(portNumber);
-             return true;
+         synchronized (usedPorts) {
+             // TODO Does not yet check if the port really is free on this machine
+             if (usedPorts.contains(portNumber)) {
+                 return false;
+             } else {
+                 usedPorts.add(portNumber);
+                 return true;
+             }
          }
      }
  


[41/50] brooklyn-server git commit: minor tidies to core (better error catching, and generics)

Posted by he...@apache.org.
minor tidies to core (better error catching, and generics)


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

Branch: refs/heads/0.6.0
Commit: 74d2380fd9fd2a9be13ca8faa15785ab0df9d7a9
Parents: 78d734e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 14 07:32:46 2013 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 14 21:21:31 2013 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java  | 4 ++++
 .../main/java/brooklyn/event/basic/DependentConfiguration.java   | 4 ++--
 2 files changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/74d2380f/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java b/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java
index 69615fd..83e541f 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityDynamicType.java
@@ -277,6 +277,10 @@ public class EntityDynamicType {
                         if (optionalEntity==null) continue;
                     }
                     Effector<?> eff = (Effector<?>) f.get(optionalEntity);
+                    if (eff==null) {
+                        LOG.warn("Effector "+f+" undefined for "+clazz+" ("+optionalEntity+")");
+                        continue;
+                    }
                     Effector<?> overwritten = result.put(eff.getName(), eff);
                     Field overwrittenFieldSource = fieldSources.put(eff.getName(), f);
                     if (overwritten!=null && !Effectors.sameInstance(overwritten, eff)) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/74d2380f/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java b/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
index f68662c..26fe214 100644
--- a/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
+++ b/core/src/main/java/brooklyn/event/basic/DependentConfiguration.java
@@ -107,11 +107,11 @@ public class DependentConfiguration {
         return DependentConfiguration.<T,T>attributePostProcessedWhenReady(source, sensor, GroovyJavaMethods.truthPredicate(), Functions.constant(value));
     }
 
-    public static <T> Task<T> valueWhenAttributeReady(Entity source, AttributeSensor<T> sensor, Function<? super T,T> valueProvider) {
+    public static <T,V> Task<V> valueWhenAttributeReady(Entity source, AttributeSensor<T> sensor, Function<? super T,V> valueProvider) {
         return attributePostProcessedWhenReady(source, sensor, GroovyJavaMethods.truthPredicate(), valueProvider);
     }
     
-    public static <T> Task<T> valueWhenAttributeReady(Entity source, AttributeSensor<T> sensor, Closure<T> valueProvider) {
+    public static <T,V> Task<V> valueWhenAttributeReady(Entity source, AttributeSensor<T> sensor, Closure<V> valueProvider) {
         return attributePostProcessedWhenReady(source, sensor, GroovyJavaMethods.truthPredicate(), valueProvider);
     }
     


[21/50] brooklyn-server git commit: Disabled WindowsPerformanceCounterFeedLiveTest and fixed comment formatting

Posted by he...@apache.org.
Disabled WindowsPerformanceCounterFeedLiveTest and fixed comment formatting


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

Branch: refs/heads/0.6.0
Commit: 9458604faab9c2d0f614acbea341651a720f1376
Parents: 76fadda
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Tue Nov 12 16:55:28 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Tue Nov 12 16:58:16 2013 +0000

----------------------------------------------------------------------
 .../WindowsPerformanceCounterFeedLiveTest.java  | 51 +++++++++++---------
 1 file changed, 29 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9458604f/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java b/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
index 64e3620..d17e910 100644
--- a/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
+++ b/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
@@ -1,5 +1,11 @@
 package brooklyn.event.feed.windows;
 
+import java.util.Map;
+
+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.basic.EntityInternal;
@@ -15,17 +21,31 @@ import brooklyn.test.EntityTestUtils;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestEntity;
 import brooklyn.util.collections.MutableMap;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
 
+/**
+ * WindowsPerformanceCounterFeed Live Test.
+ * <p>
+ * This test is currently disabled. To run, you must configure a location named {@code WindowsLiveTest}
+ * or adapt the {@link #LOCATION_SPEC} below.
+ * <p>
+ * The location must provide Windows nodes that are running an SSH server on port 22. The login credentials must
+ * be either be auto-detectable or configured in brooklyn.properties in the usual fashion.
+ * <p>
+ * Here is an example configuration from brooklyn.properties for a pre-configured Windows VM
+ * running an SSH server with public key authentication:
+ * <pre>
+ * {@code brooklyn.location.named.WindowsLiveTest=byon:(hosts="ec2-xx-xxx-xxx-xx.eu-west-1.compute.amazonaws.com")
+ * brooklyn.location.named.WindowsLiveTest.user=Administrator
+ * brooklyn.location.named.WindowsLiveTest.privateKeyFile = ~/.ssh/id_rsa
+ * brooklyn.location.named.WindowsLiveTest.publicKeyFile = ~/.ssh/id_rsa.pub
+ * }</pre>
+ * The location must by {@code byon} or another primitive type. Unfortunately, it's not possible to
+ * use a jclouds location, as adding a dependency on brooklyn-locations-jclouds would cause a
+ * cyclic dependency.
+ */
 public class WindowsPerformanceCounterFeedLiveTest {
 
     final static AttributeSensor<Double> CPU_IDLE_TIME =
@@ -33,19 +53,6 @@ public class WindowsPerformanceCounterFeedLiveTest {
     final static AttributeSensor<Integer> TELEPHONE_LINES =
             Sensors.newIntegerSensor("telephone.lines", "");
 
-    // To run this live test, you must configure a location named WindowsLiveTest, or adapt the LOCATION_SPEC below.
-    // The location must provide Windows nodes that are running an SSH server on port 22. The login credentials must
-    // be either be auto-detectable or configured in brooklyn.properties in the usual fashion.
-    //
-    // Here is an example configuration from brooklyn.properties for a pre-configured Windows VM
-    // running an SSH server with public key authentication:
-    //     brooklyn.location.named.WindowsLiveTest=byon:(hosts="ec2-xx-xxx-xxx-xx.eu-west-1.compute.amazonaws.com")
-    //     brooklyn.location.named.WindowsLiveTest.user=Administrator
-    //     brooklyn.location.named.WindowsLiveTest.privateKeyFile = ~/.ssh/id_rsa
-    //     brooklyn.location.named.WindowsLiveTest.publicKeyFile = ~/.ssh/id_rsa.pub
-    // The location must by "byon" or another primitive type. Unfortunately, it's not possible to
-    // use a jclouds location, as adding a dependency on brooklyn-locations-jclouds would cause a
-    // cyclic dependency.
     private static final String LOCATION_SPEC = "named:WindowsLiveTest";
 
     private ManagementContext mgmt;
@@ -80,7 +87,7 @@ public class WindowsPerformanceCounterFeedLiveTest {
         mgmt = null;
     }
 
-    @Test(groups = {"Live"})
+    @Test(groups={"Live","Disabled"}, enabled=false)
     public void testRetrievesPerformanceCounters() throws Exception {
         // We can be pretty sure that a Windows instance in the cloud will have zero telephone lines...
         entity.setAttribute(TELEPHONE_LINES, 42);


[40/50] brooklyn-server git commit: a handy yaml launcher

Posted by he...@apache.org.
a handy yaml launcher


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

Branch: refs/heads/0.6.0
Commit: 78d734edde8bc9743ca1728c82e9b2b845240cda
Parents: c4a5560
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Oct 31 19:49:12 2013 -0700
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 14 21:21:26 2013 +0000

----------------------------------------------------------------------
 sandbox/camp/pom.xml                            |  7 ++
 .../BrooklynAssemblyTemplateInstantiator.java   |  3 +-
 .../io/brooklyn/camp/brooklyn/YamlLauncher.java | 84 ++++++++++++++++++++
 sandbox/camp/src/test/resources/playing.yaml    |  3 +
 4 files changed, 96 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78d734ed/sandbox/camp/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/camp/pom.xml b/sandbox/camp/pom.xml
index 63add68..b095f15 100644
--- a/sandbox/camp/pom.xml
+++ b/sandbox/camp/pom.xml
@@ -56,6 +56,13 @@
             <artifactId>brooklyn-example-simple-web-cluster</artifactId>
             <version>${brooklyn.version}</version>
         </dependency>
+        <dependency>
+            <groupId>io.cloudsoft.memsql</groupId>
+            <artifactId>brooklyn-memsql</artifactId>
+            <version>0.1.0-SNAPSHOT</version>
+            <optional>true</optional>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78d734ed/sandbox/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/sandbox/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/sandbox/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 341a002..01b9c65 100644
--- a/sandbox/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/sandbox/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -48,6 +48,7 @@ import com.google.common.collect.Maps;
 
 public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateInstantiator {
 
+    public static String TARGET_LOCATION = "localhost";
     private static final Logger log = LoggerFactory.getLogger(BrooklynAssemblyTemplateInstantiator.class);
     
     @Override
@@ -167,7 +168,7 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateIns
 
         // TODO support other places besides localhost
         List<Location> locations = 
-                getBrooklynManagementContext(platform).getLocationRegistry().resolve(Arrays.asList("localhost"));
+                getBrooklynManagementContext(platform).getLocationRegistry().resolve(Arrays.asList(TARGET_LOCATION));
         
         return Entities.invokeEffector((EntityLocal)app, app, Startable.START,
                 MutableMap.of("locations", locations));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78d734ed/sandbox/camp/src/test/java/io/brooklyn/camp/brooklyn/YamlLauncher.java
----------------------------------------------------------------------
diff --git a/sandbox/camp/src/test/java/io/brooklyn/camp/brooklyn/YamlLauncher.java b/sandbox/camp/src/test/java/io/brooklyn/camp/brooklyn/YamlLauncher.java
new file mode 100644
index 0000000..260596f
--- /dev/null
+++ b/sandbox/camp/src/test/java/io/brooklyn/camp/brooklyn/YamlLauncher.java
@@ -0,0 +1,84 @@
+package io.brooklyn.camp.brooklyn;
+
+import io.brooklyn.camp.CampServer;
+import io.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator;
+import io.brooklyn.camp.brooklyn.spi.lookup.BrooklynUrlLookup;
+import io.brooklyn.camp.spi.Assembly;
+import io.brooklyn.camp.spi.AssemblyTemplate;
+import io.brooklyn.camp.spi.PlatformRootSummary;
+
+import java.io.Reader;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.config.BrooklynProperties;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynTasks;
+import brooklyn.entity.basic.Entities;
+import brooklyn.launcher.BrooklynLauncher;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.Task;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.stream.Streams;
+
+public class YamlLauncher {
+
+    private static final Logger log = LoggerFactory.getLogger(YamlLauncher.class);
+    
+    private ManagementContext brooklynMgmt;
+    private BrooklynCampPlatform platform;
+
+    public void launchPlatform() {
+        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
+              .start();
+        ((BrooklynProperties)launcher.getServerDetails().getManagementContext().getConfig()).
+          put(BrooklynUrlLookup.BROOKLYN_ROOT_URL, launcher.getServerDetails().getWebServerUrl());
+        brooklynMgmt = launcher.getServerDetails().getManagementContext();
+      
+        platform = new BrooklynCampPlatform(
+              PlatformRootSummary.builder().name("Brooklyn CAMP Platform").build(),
+              brooklynMgmt);
+        
+        new CampServer(platform, "").start();
+    }
+    
+    public void launchAppYaml(String filename) {
+        try {
+            Reader input = Streams.reader(new ResourceUtils(this).getResourceFromUrl(filename));
+            AssemblyTemplate at = platform.pdp().registerDeploymentPlan(input);
+
+            Assembly assembly = at.getInstantiator().newInstance().instantiate(at, platform);
+            Entity app = brooklynMgmt.getEntityManager().getEntity(assembly.getId());
+            log.info("Launching "+app);
+
+            Set<Task<?>> tasks = BrooklynTasks.getTasksInEntityContext(brooklynMgmt.getExecutionManager(), app);
+            log.info("Waiting on "+tasks.size()+" task(s)");
+            for (Task<?> t: tasks) t.blockUntilEnded();
+
+            log.info("App started:");
+            Entities.dumpInfo(app);
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+    public static void main(String[] args) {
+        BrooklynAssemblyTemplateInstantiator.TARGET_LOCATION =
+            "localhost"
+            //"named:hpcloud-compute-us-west-az1"
+            //"aws-ec2:us-west-2"
+            ;
+        
+        YamlLauncher l = new YamlLauncher();
+        l.launchPlatform();
+        
+//        l.launchAppYaml("java-web-app-and-db-with-function.yaml");
+//        l.launchAppYaml("java-web-app-and-memsql.yaml");
+//        l.launchAppYaml("memsql.yaml");
+        l.launchAppYaml("playing.yaml");
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78d734ed/sandbox/camp/src/test/resources/playing.yaml
----------------------------------------------------------------------
diff --git a/sandbox/camp/src/test/resources/playing.yaml b/sandbox/camp/src/test/resources/playing.yaml
new file mode 100644
index 0000000..a47f7a0
--- /dev/null
+++ b/sandbox/camp/src/test/resources/playing.yaml
@@ -0,0 +1,3 @@
+name: cassandra node
+services:
+- type: brooklyn.entity.nosql.cassandra.CassandraNode


[31/50] brooklyn-server git commit: Merge pull request #1021 from Nakomis/redhat-6-tomcat-test

Posted by he...@apache.org.
Merge pull request #1021 from Nakomis/redhat-6-tomcat-test

Added openIpTables to AbstractEc2LiveTest.test_Red_Hat_Enterprise_Linux_...

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

Branch: refs/heads/0.6.0
Commit: a22f5cb4b77cf46885e714ab097932712c022dde
Parents: 39da2b1 247845d
Author: Andrew Kennedy <gr...@apache.org>
Authored: Thu Nov 14 04:56:39 2013 -0800
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Thu Nov 14 04:56:39 2013 -0800

----------------------------------------------------------------------
 .../base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[33/50] brooklyn-server git commit: Use Entities.destroyAllCatching in tearDown of live tests

Posted by he...@apache.org.
Use Entities.destroyAllCatching in tearDown of live tests


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

Branch: refs/heads/0.6.0
Commit: 6109dd663f17e363598765b74b73f8ec1c73078c
Parents: 8b7ba88
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 13:26:56 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 13:26:56 2013 +0000

----------------------------------------------------------------------
 .../WindowsPerformanceCounterFeedLiveTest.java       |  2 +-
 .../location/jclouds/JcloudsLoginLiveTest.java       |  2 +-
 .../entity/AbstractGoogleComputeLiveTest.java        |  2 +-
 .../entity/BrooklynMgmtContextTestSupport.java       | 15 +++------------
 .../whirr/hadoop/WhirrHadoopClusterLiveTest.java     |  2 +-
 5 files changed, 7 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6109dd66/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java b/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
index d17e910..980b068 100644
--- a/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
+++ b/core/src/test/java/brooklyn/event/feed/windows/WindowsPerformanceCounterFeedLiveTest.java
@@ -83,7 +83,7 @@ public class WindowsPerformanceCounterFeedLiveTest {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (mgmt != null) Entities.destroyAll(mgmt);
+        if (mgmt != null) Entities.destroyAllCatching(mgmt);
         mgmt = null;
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6109dd66/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
index 4d7c4ea..3a2dfef 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
@@ -98,7 +98,7 @@ public class JcloudsLoginLiveTest {
             if (machine != null) jcloudsLocation.release(machine);
             machine = null;
         } finally {
-            if (managementContext != null) Entities.destroyAll(managementContext);
+            if (managementContext != null) Entities.destroyAllCatching(managementContext);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6109dd66/software/base/src/test/java/brooklyn/entity/AbstractGoogleComputeLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/AbstractGoogleComputeLiveTest.java b/software/base/src/test/java/brooklyn/entity/AbstractGoogleComputeLiveTest.java
index c9203a2..dc2a7ea 100644
--- a/software/base/src/test/java/brooklyn/entity/AbstractGoogleComputeLiveTest.java
+++ b/software/base/src/test/java/brooklyn/entity/AbstractGoogleComputeLiveTest.java
@@ -63,7 +63,7 @@ public abstract class AbstractGoogleComputeLiveTest {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
+        if (app != null) Entities.destroyAllCatching(app.getManagementContext());
     }
 
     @Test(groups = {"Live"})

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6109dd66/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java b/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
index bef60ff..e64728c 100644
--- a/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
+++ b/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
@@ -1,7 +1,5 @@
 package brooklyn.entity;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 
@@ -12,8 +10,6 @@ import brooklyn.test.entity.TestApplication;
 
 public class BrooklynMgmtContextTestSupport {
 
-    private static final Logger LOG = LoggerFactory.getLogger(BrooklynMgmtContextTestSupport.class);
-
     protected TestApplication app;
     protected ManagementContext mgmt;
 
@@ -29,13 +25,8 @@ public class BrooklynMgmtContextTestSupport {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        try {
-            if (mgmt != null) Entities.destroyAll(mgmt);
-        } catch (Throwable t) {
-            LOG.error("Caught exception in tearDown method", t);
-        } finally {
-            mgmt = null;
-        }
+        if (mgmt != null) Entities.destroyAllCatching(mgmt);
+        mgmt = null;
     }
-    
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6109dd66/systems/whirr/hadoop/src/test/java/brooklyn/extras/whirr/hadoop/WhirrHadoopClusterLiveTest.java
----------------------------------------------------------------------
diff --git a/systems/whirr/hadoop/src/test/java/brooklyn/extras/whirr/hadoop/WhirrHadoopClusterLiveTest.java b/systems/whirr/hadoop/src/test/java/brooklyn/extras/whirr/hadoop/WhirrHadoopClusterLiveTest.java
index 495aff4..e014e19 100644
--- a/systems/whirr/hadoop/src/test/java/brooklyn/extras/whirr/hadoop/WhirrHadoopClusterLiveTest.java
+++ b/systems/whirr/hadoop/src/test/java/brooklyn/extras/whirr/hadoop/WhirrHadoopClusterLiveTest.java
@@ -37,7 +37,7 @@ public class WhirrHadoopClusterLiveTest {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
+        if (app != null) Entities.destroyAllCatching(app.getManagementContext());
     }
 
     @Test(groups = { "Live" })


[48/50] brooklyn-server git commit: Merge pull request #1025 from Nakomis/map-circles

Posted by he...@apache.org.
Merge pull request #1025 from Nakomis/map-circles

Fixed issue that was preventing map markers from appearing during tab-to...

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

Branch: refs/heads/0.6.0
Commit: bb96f77b70ccf2c1faecc755aa1c47632baae744
Parents: 78ae082 9e8df21
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 15 12:56:45 2013 -0800
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 15 12:56:45 2013 -0800

----------------------------------------------------------------------
 .../src/main/java/brooklyn/rest/resources/LocationResource.java     | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------



[29/50] brooklyn-server git commit: Revert DynamicCluster.QUARANTINE_FAILED_ENTITIES default to false

Posted by he...@apache.org.
Revert DynamicCluster.QUARANTINE_FAILED_ENTITIES default to false

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

Branch: refs/heads/0.6.0
Commit: 39da2b1001645dd35eb236b79ff60bedb4a1ee56
Parents: 2f1a207
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 14 12:07:55 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 14 12:07:55 2013 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/entity/group/DynamicCluster.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/39da2b10/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
index 9b0a307..1457203 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
@@ -73,7 +73,7 @@ public interface DynamicCluster extends AbstractGroup, Cluster {
 
     @SetFromFlag("quarantineFailedEntities")
     public static final ConfigKey<Boolean> QUARANTINE_FAILED_ENTITIES = new BasicConfigKey<Boolean>(
-            Boolean.class, "dynamiccluster.quarantineFailedEntities", "If true, will quarantine entities that fail to start; if false, will get rid of them (i.e. delete them)", true);
+            Boolean.class, "dynamiccluster.quarantineFailedEntities", "If true, will quarantine entities that fail to start; if false, will get rid of them (i.e. delete them)", false);
 
     public static final AttributeSensor<Lifecycle> SERVICE_STATE = Attributes.SERVICE_STATE;
 


[23/50] brooklyn-server git commit: XML serialisation: avoid error if try to serialize entity

Posted by he...@apache.org.
XML serialisation: avoid error if try to serialize entity

- If entity/location/policy sneaks through to be serialized
  (e.g. through config key of LocationConfigKeys.CALLER_CONTEXT
  pointing at Entity)...
- Don't blow up: instead let it deserialize as null, which is better
  than failing to serialize+deserialize everything about the entity.
- Logs at WARN for first time encountered, and debug subsequently.


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

Branch: refs/heads/0.6.0
Commit: c7ff592232e1e3f6812e946304da03e03b017d83
Parents: 224fca6
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 12 11:13:59 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 12 21:52:59 2013 +0000

----------------------------------------------------------------------
 .../rebind/persister/XmlMementoSerializer.java  | 74 +++++++++++++++++++-
 1 file changed, 72 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c7ff5922/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
index c8c8d36..68d8ae1 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/XmlMementoSerializer.java
@@ -4,24 +4,41 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.IOException;
 import java.io.Writer;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Entity;
 import brooklyn.entity.rebind.dto.BasicEntityMemento;
 import brooklyn.entity.rebind.dto.BasicLocationMemento;
 import brooklyn.entity.rebind.dto.MutableBrooklynMemento;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.event.basic.BasicConfigKey;
+import brooklyn.location.Location;
+import brooklyn.policy.EntityAdjunct;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.xstream.XmlSerializer;
 
+import com.google.common.base.Function;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+
 /* uses xml, cleaned up a bit
  * 
  * there is an early attempt at doing this with JSON in pull request #344 but 
  * it is not nicely deserializable, see comments at http://xstream.codehaus.org/json-tutorial.html */  
 public class XmlMementoSerializer<T> extends XmlSerializer<T> implements MementoSerializer<T> {
-    
+
+    private static final Logger LOG = LoggerFactory.getLogger(XmlMementoSerializer.class);
+
     @SuppressWarnings("unused")
     private final ClassLoader classLoader;
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     public XmlMementoSerializer(ClassLoader classLoader) {
         this.classLoader = checkNotNull(classLoader, "classLoader");
         xstream.alias("brooklyn", MutableBrooklynMemento.class);
@@ -29,6 +46,18 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         xstream.alias("location", BasicLocationMemento.class);
         xstream.alias("configKey", BasicConfigKey.class);
         xstream.alias("attributeSensor", BasicAttributeSensor.class);
+        xstream.registerConverter(new ConverterImpl(Location.class, new Function<Location,String>() {
+            @Override public String apply(Location input) {
+                return (input != null) ? input.getId() : null;
+            }}));
+        xstream.registerConverter(new ConverterImpl(Entity.class, new Function<Entity,String>() {
+            @Override public String apply(Entity input) {
+                return (input != null) ? input.getId() : null;
+            }}));
+        xstream.registerConverter(new ConverterImpl(EntityAdjunct.class, new Function<EntityAdjunct,String>() {
+            @Override public String apply(EntityAdjunct input) {
+                return (input != null) ? input.getId() : null;
+            }}));
     }
     
     @Override
@@ -41,4 +70,45 @@ public class XmlMementoSerializer<T> extends XmlSerializer<T> implements Memento
         }
     }
 
-}
\ No newline at end of file
+    public static class ConverterImpl<T> implements Converter {
+        private final AtomicBoolean hasWarned = new AtomicBoolean(false);
+        private final Class<?> converatable;
+        private final Function<T,String> idExtractor;
+        
+        ConverterImpl(Class<T> converatable, Function<T,String> idExtractor) {
+            this.converatable = checkNotNull(converatable, "converatable");
+            this.idExtractor = checkNotNull(idExtractor, "idExtractor");
+        }
+        
+        @SuppressWarnings({ "rawtypes" })
+        @Override
+        public boolean canConvert(Class type) {
+            return converatable.isAssignableFrom(type);
+        }
+        
+        @SuppressWarnings("unchecked")
+        @Override
+        public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
+            if (source != null) {
+                if (hasWarned.compareAndSet(false, true)) {
+                    LOG.warn("Cannot marshall to xml (for persistence) {} {}; should have been intercepted; unmarshalling will give null!", converatable.getSimpleName(), source);
+                } else {
+                    LOG.debug("Cannot marshall to xml (for persistence) {} {}; should have been intercepted; unmarshalling will give null!", converatable.getSimpleName(), source);
+                }
+            }
+            // no-op; can't marshall this; deserializing will give null!
+            writer.startNode("unserializableLocation");
+            writer.setValue(idExtractor.apply((T)source));
+            writer.endNode();
+        }
+
+        @Override
+        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
+            reader.moveDown();
+            String id = reader.getValue();
+            reader.moveUp();
+            LOG.warn("Cannot unmarshall from persisted xml {} {}; should have been intercepted; returning null!", converatable.getSimpleName(), id);
+            return null;
+        }
+    }
+}


[36/50] brooklyn-server git commit: Updated another Ubuntu 12.04 AMI id

Posted by he...@apache.org.
Updated another Ubuntu 12.04 AMI id


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

Branch: refs/heads/0.6.0
Commit: e74a2023db4c7981074724a9af1204a8cf7e5def
Parents: 26cef98
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 15:11:17 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 15:11:17 2013 +0000

----------------------------------------------------------------------
 .../java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e74a2023/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
index 3a2dfef..95745d4 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLoginLiveTest.java
@@ -43,8 +43,8 @@ public class JcloudsLoginLiveTest {
     // 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}}
     public static final String AWS_EC2_CENTOS_IMAGE_ID = "us-east-1/ami-7d7bfc14";
 
-    // Image: {id=us-east-1/ami-950680fc, providerId=ami-950680fc, name=RightImage_Ubuntu_12.04_x64_v5.8.8, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.manifest.xml, is64Bit=true}, description=rightscale-us-east/RightImage_Ubuntu_12.04_x64_v5.8.8.manifest.xml, version=5.8.8, status=AVAILABLE[available], loginUser=root, userMetadata={owner=411009282317, rootDeviceType=instance-store, virtualizationType=paravirtual, hypervisor=xen}}
-    public static final String AWS_EC2_UBUNTU_IMAGE_ID = "us-east-1/ami-950680fc";
+    // Image: {id=us-east-1/ami-d0f89fb9, providerId=ami-d0f89fb9, name=ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=ubuntu, arch=paravirtual, version=12.04, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, is64Bit=true}, description=099720109477/ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20130411.1, version=20130411.1, status=AVAILABLE[available], loginUser=ubuntu, userMetadata={owner=099720109477, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
+    public static final String AWS_EC2_UBUNTU_IMAGE_ID = "us-east-1/ami-d0f89fb9";
 
     public static final String RACKSPACE_PROVIDER = "rackspace-cloudservers-uk";
     public static final String RACKSPACE_LOCATION_SPEC = "jclouds:" + RACKSPACE_PROVIDER;


[30/50] brooklyn-server git commit: Added openIpTables to AbstractEc2LiveTest.test_Red_Hat_Enterprise_Linux_6

Posted by he...@apache.org.
Added openIpTables to AbstractEc2LiveTest.test_Red_Hat_Enterprise_Linux_6


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

Branch: refs/heads/0.6.0
Commit: 247845decfe390689beb727907b523653eee6f7b
Parents: 2f1a207
Author: Martin Harris <gi...@nakomis.com>
Authored: Thu Nov 14 12:48:03 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Thu Nov 14 12:48:03 2013 +0000

----------------------------------------------------------------------
 .../base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/247845de/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
index 9e5fa13..ac9e800 100644
--- a/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
+++ b/software/base/src/test/java/brooklyn/entity/AbstractEc2LiveTest.java
@@ -7,6 +7,7 @@ import org.testng.annotations.Test;
 
 import brooklyn.config.BrooklynProperties;
 import brooklyn.location.Location;
+import brooklyn.location.jclouds.JcloudsLocationConfig;
 import brooklyn.management.internal.LocalManagementContext;
 import brooklyn.util.collections.MutableMap;
 
@@ -88,7 +89,7 @@ public abstract class AbstractEc2LiveTest extends BrooklynMgmtContextTestSupport
     @Test(groups = {"Live"})
     public void test_Red_Hat_Enterprise_Linux_6() throws Exception {
         // Image: {id=us-east-1/ami-a35a33ca, providerId=ami-a35a33ca, name=RHEL-6.3_GA-x86_64-5-Hourly2, location={scope=REGION, id=us-east-1, description=us-east-1, parent=aws-ec2, iso3166Codes=[US-VA]}, os={family=rhel, arch=paravirtual, version=6.0, description=309956199498/RHEL-6.3_GA-x86_64-5-Hourly2, is64Bit=true}, description=309956199498/RHEL-6.3_GA-x86_64-5-Hourly2, version=Hourly2, status=AVAILABLE[available], loginUser=root, userMetadata={owner=309956199498, rootDeviceType=ebs, virtualizationType=paravirtual, hypervisor=xen}}
-        runTest(ImmutableMap.of("imageId", "us-east-1/ami-a35a33ca", "hardwareId", SMALL_HARDWARE_ID));
+        runTest(ImmutableMap.of("imageId", "us-east-1/ami-a35a33ca", "hardwareId", SMALL_HARDWARE_ID, JcloudsLocationConfig.OPEN_IPTABLES.getName(), "true"));
     }
     
     protected void runTest(Map<String,?> flags) throws Exception {


[17/50] brooklyn-server git commit: DynamicCluster.quarantineFailedEntities now defaults to true

Posted by he...@apache.org.
DynamicCluster.quarantineFailedEntities now defaults to true


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

Branch: refs/heads/0.6.0
Commit: 5decba3aa3fde7db24ea51e4f33e8d0c69bbd500
Parents: be4ab78
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 7 09:59:18 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 7 10:33:04 2013 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/group/DynamicCluster.java   |  2 +-
 .../entity/group/DynamicClusterTest.groovy      | 34 +++++++++++---------
 .../entity/group/DynamicFabricTest.java         | 32 ++++++++++--------
 3 files changed, 39 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5decba3a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
index 3f2347c..2cd4b48 100644
--- a/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
+++ b/core/src/main/java/brooklyn/entity/group/DynamicCluster.java
@@ -62,7 +62,7 @@ public interface DynamicCluster extends AbstractGroup, Cluster {
 
     @SetFromFlag("quarantineFailedEntities")
     public static final ConfigKey<Boolean> QUARANTINE_FAILED_ENTITIES = new BasicConfigKey<Boolean>(
-            Boolean.class, "dynamiccluster.quarantineFailedEntities", "Whether to guarantine entities that fail to start, or to try to clean them up", false);
+            Boolean.class, "dynamiccluster.quarantineFailedEntities", "Whether to quarantine entities that fail to start, or to try to clean them up", true);
 
     public static final AttributeSensor<Lifecycle> SERVICE_STATE = Attributes.SERVICE_STATE;
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5decba3a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
index ae5e493..1e113d7 100644
--- a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
+++ b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
@@ -141,7 +141,7 @@ class DynamicClusterTest {
         cluster.start([loc])
 
         cluster.resize(1)
-        Entity entity = Iterables.getOnlyElement(cluster.getChildren());
+        Entity entity = Iterables.getOnlyElement(cluster.getMembers());
         assertEquals entity.count, 1
         assertEquals entity.parent, cluster
         assertEquals entity.application, app
@@ -312,9 +312,9 @@ class DynamicClusterTest {
         cluster.start([loc])
         cluster.resize(3)
         assertEquals(cluster.currentSize, 2)
-        assertEquals(cluster.children.size(), 2)
-        cluster.children.each {
-            assertFalse(((FailingEntity)it).failOnStart)
+        assertEquals(cluster.getMembers().size(), 2)
+        for (Entity member : cluster.getMembers()) {
+            assertFalse(((FailingEntity)member).failOnStart)
         }
     }
 
@@ -331,10 +331,12 @@ class DynamicClusterTest {
                 }));
 
         cluster.start([loc])
+        
+        // note that children include quarantine group; and quarantined nodes
         assertEquals(cluster.getCurrentSize(), 1)
-        assertEquals(cluster.getChildren().size(), 1)
-        for (Entity child : cluster.getChildren()) {
-            assertFalse(((FailingEntity)child).failOnStart)
+        assertEquals(cluster.getMembers().size(), 1)
+        for (Entity member : cluster.getMembers()) {
+            assertFalse(((FailingEntity)member).failOnStart)
         }
     }
 
@@ -359,10 +361,12 @@ class DynamicClusterTest {
                 throw e; // fail
             }
         }
+        
+        // note that children include quarantine group; and quarantined nodes
         assertEquals(cluster.getCurrentSize(), 1)
-        assertEquals(cluster.getChildren().size(), 1)
-        for (Entity child : cluster.getChildren()) {
-            assertFalse(((FailingEntity)child).failOnStart)
+        assertEquals(cluster.getMembers().size(), 1)
+        for (Entity member : cluster.getMembers()) {
+            assertFalse(((FailingEntity)member).failOnStart)
         }
     }
 
@@ -382,7 +386,7 @@ class DynamicClusterTest {
         cluster.resize(3)
         assertEquals(cluster.currentSize, 2)
         assertEquals(cluster.getMembers().size(), 2)
-        assertEquals(Iterables.size(Iterables.filter(cluster.children, Predicates.instanceOf(FailingEntity.class))), 3)
+        assertEquals(Iterables.size(Iterables.filter(cluster.getChildren(), Predicates.instanceOf(FailingEntity.class))), 3)
         cluster.members.each {
             assertFalse(((FailingEntity)it).failOnStart)
         }
@@ -410,12 +414,12 @@ class DynamicClusterTest {
         cluster.resize(1)
         cluster.resize(2)
         assertEquals(cluster.currentSize, 2)
-        assertEquals(ImmutableSet.copyOf(cluster.getChildren()), ImmutableSet.copyOf(creationOrder), "actual="+cluster.getChildren())
+        assertEquals(ImmutableSet.copyOf(cluster.getMembers()), ImmutableSet.copyOf(creationOrder), "actual="+cluster.getMembers())
 
         // Now stop one
         cluster.resize(1)
         assertEquals(cluster.currentSize, 1)
-        assertEquals(ImmutableList.copyOf(cluster.getChildren()), creationOrder.subList(0, 1))
+        assertEquals(ImmutableList.copyOf(cluster.getMembers()), creationOrder.subList(0, 1))
     }
 
     @Test
@@ -441,12 +445,12 @@ class DynamicClusterTest {
 
         cluster.start([loc])
 
-        TestEntity child = cluster.children.get(0)
+        TestEntity child = Iterables.get(cluster.getMembers(), 0);
         child.stop()
         Entities.unmanage(child)
 
         TestUtils.executeUntilSucceeds(timeout:TIMEOUT_MS) {
-            assertEquals(cluster.children.size(), 0)
+            assertFalse(cluster.getChildren().contains(child), "children="+cluster.getChildren())
             assertEquals(cluster.currentSize, 0)
             assertEquals(cluster.members.size(), 0)
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5decba3a/core/src/test/java/brooklyn/entity/group/DynamicFabricTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/DynamicFabricTest.java b/core/src/test/java/brooklyn/entity/group/DynamicFabricTest.java
index 005b09e..9c9e084 100644
--- a/core/src/test/java/brooklyn/entity/group/DynamicFabricTest.java
+++ b/core/src/test/java/brooklyn/entity/group/DynamicFabricTest.java
@@ -20,6 +20,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import brooklyn.entity.Entity;
+import brooklyn.entity.Group;
 import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.BasicEntity;
@@ -377,20 +378,21 @@ public class DynamicFabricTest {
 		app.start(ImmutableList.of(loc1));
 
 		assertEquals(fabric.getChildren().size(), 1);
-		assertEquals(getChild(fabric, 0).getChildren().size(), 1);
-		assertEquals(getGrandchild(fabric, 0, 0).getConfig(Attributes.HTTP_PORT.getConfigKey()), PortRanges.fromInteger(1234));
-		assertEquals(((TestEntity)getGrandchild(fabric, 0, 0)).getConfigureProperties().get("a"), null);
-		assertEquals(((TestEntity)getGrandchild(fabric, 0, 0)).getConfigureProperties().get("b"), "avail");
-		assertEquals(((TestEntity)getGrandchild(fabric, 0, 0)).getConfigureProperties().get("fromCluster"), "passed to base entity");
-		assertEquals(((TestEntity)getGrandchild(fabric, 0, 0)).getConfigureProperties().get("fromFabric"), null);
-
-        ((DynamicCluster)getChild(fabric, 0)).resize(2);
-        assertEquals(getChild(fabric, 0).getChildren().size(), 2);
+		DynamicCluster child = (DynamicCluster) getChild(fabric, 0);
+		assertEquals(child.getMembers().size(), 1);
+		assertEquals(getMember(child, 0).getConfig(Attributes.HTTP_PORT.getConfigKey()), PortRanges.fromInteger(1234));
+		assertEquals(((TestEntity)getMember(child, 0)).getConfigureProperties().get("a"), null);
+		assertEquals(((TestEntity)getMember(child, 0)).getConfigureProperties().get("b"), "avail");
+		assertEquals(((TestEntity)getMember(child, 0)).getConfigureProperties().get("fromCluster"), "passed to base entity");
+		assertEquals(((TestEntity)getMember(child, 0)).getConfigureProperties().get("fromFabric"), null);
+
+        child.resize(2);
+        assertEquals(child.getMembers().size(), 2);
         assertEquals(getGrandchild(fabric, 0, 1).getConfig(Attributes.HTTP_PORT.getConfigKey()), PortRanges.fromInteger(1234));
-        assertEquals(((TestEntity)getGrandchild(fabric, 0, 1)).getConfigureProperties().get("a"), null);
-        assertEquals(((TestEntity)getGrandchild(fabric, 0, 1)).getConfigureProperties().get("b"), "avail");
-        assertEquals(((TestEntity)getGrandchild(fabric, 0, 1)).getConfigureProperties().get("fromCluster"), "passed to base entity");
-        assertEquals(((TestEntity)getGrandchild(fabric, 0, 1)).getConfigureProperties().get("fromFabric"), null);
+        assertEquals(((TestEntity)getMember(child, 1)).getConfigureProperties().get("a"), null);
+        assertEquals(((TestEntity)getMember(child, 1)).getConfigureProperties().get("b"), "avail");
+        assertEquals(((TestEntity)getMember(child, 1)).getConfigureProperties().get("fromCluster"), "passed to base entity");
+        assertEquals(((TestEntity)getMember(child, 1)).getConfigureProperties().get("fromFabric"), null);
 	}
 
 	private Entity getGrandchild(Entity entity, int childIndex, int grandchildIndex) {
@@ -401,4 +403,8 @@ public class DynamicFabricTest {
     private Entity getChild(Entity entity, int childIndex) {
         return Iterables.get(entity.getChildren(), childIndex);
     }
+    
+    private Entity getMember(Group entity, int memberIndex) {
+        return Iterables.get(entity.getMembers(), memberIndex);
+    }
 }


[50/50] brooklyn-server git commit: Changed version to 0.6.0

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


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

Branch: refs/heads/0.6.0
Commit: fcc3898446607284aa643ace1115d4351e54b824
Parents: 2863788
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 18 15:30:59 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 18 15:30:59 2013 +0000

----------------------------------------------------------------------
 api/pom.xml                                                      | 2 +-
 core/pom.xml                                                     | 2 +-
 core/src/main/java/brooklyn/BrooklynVersion.java                 | 2 +-
 locations/jclouds/pom.xml                                        | 2 +-
 policy/pom.xml                                                   | 2 +-
 pom.xml                                                          | 4 ++--
 sandbox/camp/pom.xml                                             | 2 +-
 software/base/pom.xml                                            | 2 +-
 .../src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java | 2 +-
 .../base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java | 2 +-
 storage/hazelcast/pom.xml                                        | 2 +-
 systems/paas/openshift/pom.xml                                   | 2 +-
 systems/whirr/base/pom.xml                                       | 2 +-
 systems/whirr/hadoop/pom.xml                                     | 2 +-
 usage/cli/pom.xml                                                | 2 +-
 usage/launcher/pom.xml                                           | 2 +-
 usage/logback-includes/pom.xml                                   | 2 +-
 usage/logback-xml/pom.xml                                        | 2 +-
 usage/rest-api/pom.xml                                           | 2 +-
 usage/rest-client/pom.xml                                        | 2 +-
 usage/rest-server/pom.xml                                        | 2 +-
 usage/test-support/pom.xml                                       | 2 +-
 utils/common/pom.xml                                             | 2 +-
 .../src/test/java/brooklyn/util/maven/MavenArtifactTest.java     | 4 ++--
 utils/groovy/pom.xml                                             | 2 +-
 utils/jmx/jmxmp-ssl-agent/pom.xml                                | 2 +-
 utils/jmx/jmxrmi-agent/pom.xml                                   | 2 +-
 utils/rest-swagger/pom.xml                                       | 2 +-
 utils/test-support/pom.xml                                       | 2 +-
 29 files changed, 31 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/api/pom.xml
----------------------------------------------------------------------
diff --git a/api/pom.xml b/api/pom.xml
index aae6a22..56b989e 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 9c69c9e..17987e7 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/core/src/main/java/brooklyn/BrooklynVersion.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/BrooklynVersion.java b/core/src/main/java/brooklyn/BrooklynVersion.java
index 25b9c1f..8406411 100644
--- a/core/src/main/java/brooklyn/BrooklynVersion.java
+++ b/core/src/main/java/brooklyn/BrooklynVersion.java
@@ -22,7 +22,7 @@ public class BrooklynVersion {
   private final String versionFromClasspath;
   // static useful when running from the IDE
   // TODO is the classpath version ever useful? should we always use the static?
-  private final String versionFromStatic = "0.6.0-SNAPSHOT"; // BROOKLYN_VERSION
+  private final String versionFromStatic = "0.6.0"; // BROOKLYN_VERSION
   private final String version;
 
   public BrooklynVersion() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/locations/jclouds/pom.xml
----------------------------------------------------------------------
diff --git a/locations/jclouds/pom.xml b/locations/jclouds/pom.xml
index 96ec30a..93d24f3 100644
--- a/locations/jclouds/pom.xml
+++ b/locations/jclouds/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/policy/pom.xml
----------------------------------------------------------------------
diff --git a/policy/pom.xml b/policy/pom.xml
index eca8d4c..e98230a 100644
--- a/policy/pom.xml
+++ b/policy/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 8fa620f..ad4d0eb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>io.brooklyn</groupId>
     <artifactId>brooklyn-parent</artifactId>
-    <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+    <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
 
     <name>Brooklyn Parent Project</name>
     <description>
@@ -75,7 +75,7 @@
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <brooklyn.version>0.6.0-SNAPSHOT</brooklyn.version>  <!-- BROOKLYN_VERSION -->
+        <brooklyn.version>0.6.0</brooklyn.version>  <!-- BROOKLYN_VERSION -->
 
         <cobertura.version>1.9.4.1</cobertura.version>
         <surefire.version>2.13</surefire.version>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/sandbox/camp/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/camp/pom.xml b/sandbox/camp/pom.xml
index 63add68..8851877 100644
--- a/sandbox/camp/pom.xml
+++ b/sandbox/camp/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/software/base/pom.xml
----------------------------------------------------------------------
diff --git a/software/base/pom.xml b/software/base/pom.xml
index 4b6cb81..15b62ea 100644
--- a/software/base/pom.xml
+++ b/software/base/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
index b41bcad..c7270cb 100644
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
+++ b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
@@ -32,7 +32,7 @@ public interface BrooklynNode extends SoftwareProcess, UsesJava {
             Map.class, "brooklynnode.copytorundir", "URLs of resources to be copied across to the server, giving the path they are to be copied to", MutableMap.of());
     
     @SetFromFlag("version")
-    public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(BrooklynConfigKeys.SUGGESTED_VERSION, "0.6.0-SNAPSHOT"); // BROOKLYN_VERSION
+    public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(BrooklynConfigKeys.SUGGESTED_VERSION, "0.6.0"); // BROOKLYN_VERSION
 
     // Takes presidence over downloadUrl, if non-null
     @SetFromFlag("distroUploadUrl")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java b/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
index 34f3721..3fa3e16 100644
--- a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
+++ b/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java
@@ -19,7 +19,7 @@ import com.google.common.base.Preconditions;
 
 public class JmxmpSslSupport {
 
-    final static String BROOKLYN_VERSION = "0.6.0-SNAPSHOT";  // BROOKLYN_VERSION (updated by script)
+    final static String BROOKLYN_VERSION = "0.6.0";  // BROOKLYN_VERSION (updated by script)
     
     private final JmxSupport jmxSupport;
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/storage/hazelcast/pom.xml
----------------------------------------------------------------------
diff --git a/storage/hazelcast/pom.xml b/storage/hazelcast/pom.xml
index 19a29ec..92bbef8 100644
--- a/storage/hazelcast/pom.xml
+++ b/storage/hazelcast/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/systems/paas/openshift/pom.xml
----------------------------------------------------------------------
diff --git a/systems/paas/openshift/pom.xml b/systems/paas/openshift/pom.xml
index cd9ad7f..bd0d2ca 100644
--- a/systems/paas/openshift/pom.xml
+++ b/systems/paas/openshift/pom.xml
@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/systems/whirr/base/pom.xml
----------------------------------------------------------------------
diff --git a/systems/whirr/base/pom.xml b/systems/whirr/base/pom.xml
index 799fef1..74a0932 100644
--- a/systems/whirr/base/pom.xml
+++ b/systems/whirr/base/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/systems/whirr/hadoop/pom.xml
----------------------------------------------------------------------
diff --git a/systems/whirr/hadoop/pom.xml b/systems/whirr/hadoop/pom.xml
index e25020d..ea2018d 100644
--- a/systems/whirr/hadoop/pom.xml
+++ b/systems/whirr/hadoop/pom.xml
@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/cli/pom.xml
----------------------------------------------------------------------
diff --git a/usage/cli/pom.xml b/usage/cli/pom.xml
index bad835f..1f979e7 100644
--- a/usage/cli/pom.xml
+++ b/usage/cli/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/launcher/pom.xml
----------------------------------------------------------------------
diff --git a/usage/launcher/pom.xml b/usage/launcher/pom.xml
index 206827c..b0cf6af 100644
--- a/usage/launcher/pom.xml
+++ b/usage/launcher/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/logback-includes/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-includes/pom.xml b/usage/logback-includes/pom.xml
index 1761019..218ed81 100644
--- a/usage/logback-includes/pom.xml
+++ b/usage/logback-includes/pom.xml
@@ -15,7 +15,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/logback-xml/pom.xml
----------------------------------------------------------------------
diff --git a/usage/logback-xml/pom.xml b/usage/logback-xml/pom.xml
index ef8a661..7867746 100644
--- a/usage/logback-xml/pom.xml
+++ b/usage/logback-xml/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/rest-api/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-api/pom.xml b/usage/rest-api/pom.xml
index 996c6a0..a02d23e 100644
--- a/usage/rest-api/pom.xml
+++ b/usage/rest-api/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/rest-client/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-client/pom.xml b/usage/rest-client/pom.xml
index 0dc382a..fef2c52 100644
--- a/usage/rest-client/pom.xml
+++ b/usage/rest-client/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version> <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version> <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/rest-server/pom.xml
----------------------------------------------------------------------
diff --git a/usage/rest-server/pom.xml b/usage/rest-server/pom.xml
index ddcd8e7..43cbe78 100644
--- a/usage/rest-server/pom.xml
+++ b/usage/rest-server/pom.xml
@@ -11,7 +11,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version><!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version><!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/usage/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/usage/test-support/pom.xml b/usage/test-support/pom.xml
index cfc88b1..5bab6c5 100644
--- a/usage/test-support/pom.xml
+++ b/usage/test-support/pom.xml
@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>io.brooklyn</groupId>
 		<artifactId>brooklyn-parent</artifactId>
-		<version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+		<version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/common/pom.xml
----------------------------------------------------------------------
diff --git a/utils/common/pom.xml b/utils/common/pom.xml
index eb4c52b..4727299 100644
--- a/utils/common/pom.xml
+++ b/utils/common/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java b/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
index 3c2ecc9..9c2f7fa 100644
--- a/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
+++ b/utils/common/src/test/java/brooklyn/util/maven/MavenArtifactTest.java
@@ -21,7 +21,7 @@ public class MavenArtifactTest {
     // only *integration* tests require these to be *installed*;
     // note this may vary from machine to machine so version should be aligned with that in parent pom
     final static String MAVEN_JAR_PLUGIN_COORDINATE = "org.apache.maven.plugins:maven-jar-plugin:jar:2.4";
-    final static String THIS_PROJECT_COORDINATE = "io.brooklyn:brooklyn-utils-common:jar:0.6.0-SNAPSHOT";  // BROOKLYN_VERSION
+    final static String THIS_PROJECT_COORDINATE = "io.brooklyn:brooklyn-utils-common:jar:0.6.0";  // BROOKLYN_VERSION
     
     public void testArtifact() {
         MavenArtifact m = MavenArtifact.fromCoordinate(MAVEN_JAR_PLUGIN_COORDINATE);
@@ -108,7 +108,7 @@ public class MavenArtifactTest {
     @Test(groups="Integration")
     public void testRetrievalHostedSnapshotIntegration() {
         MavenArtifact m = MavenArtifact.fromCoordinate(
-                "io.brooklyn:brooklyn-utils-common:jar:0.6.0-SNAPSHOT");  // BROOKLYN_VERSION
+                "io.brooklyn:brooklyn-utils-common:jar:0.6.0");  // BROOKLYN_VERSION
         
         String localPath = new MavenRetriever().getLocalPath(m);
         File f = new File(localPath);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/groovy/pom.xml
----------------------------------------------------------------------
diff --git a/utils/groovy/pom.xml b/utils/groovy/pom.xml
index 8aaba23..165c72d 100644
--- a/utils/groovy/pom.xml
+++ b/utils/groovy/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/jmx/jmxmp-ssl-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxmp-ssl-agent/pom.xml b/utils/jmx/jmxmp-ssl-agent/pom.xml
index b95074a..f5c853c 100644
--- a/utils/jmx/jmxmp-ssl-agent/pom.xml
+++ b/utils/jmx/jmxmp-ssl-agent/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/jmx/jmxrmi-agent/pom.xml
----------------------------------------------------------------------
diff --git a/utils/jmx/jmxrmi-agent/pom.xml b/utils/jmx/jmxrmi-agent/pom.xml
index e3695c7..d84fee8 100644
--- a/utils/jmx/jmxrmi-agent/pom.xml
+++ b/utils/jmx/jmxrmi-agent/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/rest-swagger/pom.xml
----------------------------------------------------------------------
diff --git a/utils/rest-swagger/pom.xml b/utils/rest-swagger/pom.xml
index c0be5dc..8b8aa5b 100644
--- a/utils/rest-swagger/pom.xml
+++ b/utils/rest-swagger/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fcc38984/utils/test-support/pom.xml
----------------------------------------------------------------------
diff --git a/utils/test-support/pom.xml b/utils/test-support/pom.xml
index 027ce52..af54e64 100644
--- a/utils/test-support/pom.xml
+++ b/utils/test-support/pom.xml
@@ -13,7 +13,7 @@
     <parent>
         <groupId>io.brooklyn</groupId>
         <artifactId>brooklyn-parent</artifactId>
-        <version>0.6.0-SNAPSHOT</version>  <!-- BROOKLYN_VERSION -->
+        <version>0.6.0</version>  <!-- BROOKLYN_VERSION -->
         <relativePath>../../pom.xml</relativePath>
     </parent>
 


[44/50] brooklyn-server git commit: Add DynamicClusterTest.testDoNotQuarantineFailedEntities

Posted by he...@apache.org.
Add DynamicClusterTest.testDoNotQuarantineFailedEntities

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

Branch: refs/heads/0.6.0
Commit: 408296cbbecf2061b6ceba5294be29f5e43e2f9b
Parents: 0230712
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 15 10:53:28 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 15 10:53:28 2013 +0000

----------------------------------------------------------------------
 .../entity/group/DynamicClusterTest.groovy      | 31 ++++++++++++++++++++
 1 file changed, 31 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/408296cb/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
index 1e113d7..c482922 100644
--- a/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
+++ b/core/src/test/java/brooklyn/entity/group/DynamicClusterTest.groovy
@@ -398,6 +398,37 @@ class DynamicClusterTest {
     }
 
     @Test
+    public void testDoNotQuarantineFailedEntities() {
+        final int failNum = 2
+        final AtomicInteger counter = new AtomicInteger(0)
+        DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
+                // default is quarantineFailedEntities==false in 0.6.x
+                //.configure("quarantineFailedEntities", false)
+                .configure("initialSize", 0)
+                .configure("factory", { properties ->
+                    int num = counter.incrementAndGet();
+                    return new FailingEntity(properties, (num==failNum))
+                }));
+
+        cluster.start([loc])
+        
+        // no quarantine group, as a child
+        assertEquals(cluster.getChildren().size(), 0, "children="+cluster.getChildren())
+        
+        // Failed node will not be a member or child
+        cluster.resize(3)
+        assertEquals(cluster.currentSize, 2)
+        assertEquals(cluster.getMembers().size(), 2)
+        assertEquals(cluster.getChildren().size(), 2, "children="+cluster.getChildren())
+        
+        // Failed node will not be managed either
+        assertEquals(Iterables.size(Iterables.filter(cluster.getChildren(), Predicates.instanceOf(FailingEntity.class))), 2)
+        for (Entity member : cluster.getMembers()) {
+            assertFalse(((FailingEntity)member).failOnStart)
+        }
+    }
+
+    @Test
     public void defaultRemovalStrategyShutsDownNewestFirstWhenResizing() {
         TestEntity entity
         final int failNum = 2


[43/50] brooklyn-server git commit: camp: remove test dependency on memsql

Posted by he...@apache.org.
camp: remove test dependency on memsql

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

Branch: refs/heads/0.6.0
Commit: 0230712fc61f8cbc233ed452a4a141454af40c82
Parents: 3578ae4
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 15 10:24:24 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 15 10:24:24 2013 +0000

----------------------------------------------------------------------
 sandbox/camp/pom.xml | 7 -------
 1 file changed, 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/0230712f/sandbox/camp/pom.xml
----------------------------------------------------------------------
diff --git a/sandbox/camp/pom.xml b/sandbox/camp/pom.xml
index b095f15..63add68 100644
--- a/sandbox/camp/pom.xml
+++ b/sandbox/camp/pom.xml
@@ -56,13 +56,6 @@
             <artifactId>brooklyn-example-simple-web-cluster</artifactId>
             <version>${brooklyn.version}</version>
         </dependency>
-        <dependency>
-            <groupId>io.cloudsoft.memsql</groupId>
-            <artifactId>brooklyn-memsql</artifactId>
-            <version>0.1.0-SNAPSHOT</version>
-            <optional>true</optional>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <build>


[35/50] brooklyn-server git commit: Changed AwsEc2LocationLiveTest to Java and fixed image pattern

Posted by he...@apache.org.
Changed AwsEc2LocationLiveTest to Java and fixed image pattern


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

Branch: refs/heads/0.6.0
Commit: 26cef980e4b2d01a7d9d8f3149b7482389cf97e6
Parents: dfe4c0f
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Thu Nov 14 15:01:47 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Thu Nov 14 15:01:47 2013 +0000

----------------------------------------------------------------------
 .../jclouds/AwsEc2LocationLiveTest.groovy       | 46 -------------------
 .../jclouds/AwsEc2LocationLiveTest.java         | 48 ++++++++++++++++++++
 2 files changed, 48 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26cef980/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.groovy
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.groovy b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.groovy
deleted file mode 100644
index 2205825..0000000
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.groovy
+++ /dev/null
@@ -1,46 +0,0 @@
-package brooklyn.location.jclouds
-
-import static org.testng.Assert.*
-
-import org.testng.annotations.DataProvider
-import org.testng.annotations.Test
-
-class AwsEc2LocationLiveTest extends AbstractJcloudsLocationTest {
-
-    private static final String PROVIDER = "aws-ec2"
-    private static final String EUWEST_REGION_NAME = "eu-west-1"
-    private static final String USEAST_REGION_NAME = "us-east-1"
-    private static final String EUWEST_IMAGE_ID = EUWEST_REGION_NAME+"/"+"ami-89def4fd"
-    private static final String USEAST_IMAGE_ID = USEAST_REGION_NAME+"/"+"ami-2342a94a"
-    private static final String IMAGE_OWNER = "411009282317"
-    private static final String IMAGE_PATTERN = ".*RightImage_CentOS_5.4_i386_v5.5.9_EBS.*"
-
-    public AwsEc2LocationLiveTest() {
-        super(PROVIDER)
-    }
-
-    @Override
-    @DataProvider(name = "fromImageId")
-    public Object[][] cloudAndImageIds() {
-        return [
-            [ EUWEST_REGION_NAME, EUWEST_IMAGE_ID, IMAGE_OWNER ],
-            [ USEAST_REGION_NAME, USEAST_IMAGE_ID, IMAGE_OWNER] ]
-    }
-
-    @Override
-    @DataProvider(name = "fromImageDescriptionPattern")
-    public Object[][] cloudAndImageDescriptionPatterns() {
-        return [
-            [ USEAST_REGION_NAME, IMAGE_PATTERN, IMAGE_OWNER ],
-            [ USEAST_REGION_NAME, IMAGE_PATTERN, IMAGE_OWNER] ]
-    }
-
-    @Override
-    @DataProvider(name = "fromImageNamePattern")
-    public Object[][] cloudAndImageNamePatterns() {
-        return []
-    }
-
-    @Test(enabled = false)
-    public void noop() { } /* just exists to let testNG IDE run the test */
-}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26cef980/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.java
new file mode 100644
index 0000000..f28dee5
--- /dev/null
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AwsEc2LocationLiveTest.java
@@ -0,0 +1,48 @@
+package brooklyn.location.jclouds;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class AwsEc2LocationLiveTest extends AbstractJcloudsLocationTest {
+
+    private static final String PROVIDER = "aws-ec2";
+    private static final String EUWEST_REGION_NAME = "eu-west-1";
+    private static final String USEAST_REGION_NAME = "us-east-1";
+    private static final String EUWEST_IMAGE_ID = EUWEST_REGION_NAME+"/"+"ami-89def4fd";
+    private static final String USEAST_IMAGE_ID = USEAST_REGION_NAME+"/"+"ami-2342a94a";
+    private static final String IMAGE_OWNER = "411009282317";
+    private static final String IMAGE_PATTERN = "RightImage_CentOS_5.4_i386_v5.5.9_EBS";
+
+    public AwsEc2LocationLiveTest() {
+        super(PROVIDER);
+    }
+
+    @Override
+    @DataProvider(name = "fromImageId")
+    public Object[][] cloudAndImageIds() {
+        return new Object[][] {
+                new Object[] { EUWEST_REGION_NAME, EUWEST_IMAGE_ID, IMAGE_OWNER },
+                new Object[] { USEAST_REGION_NAME, USEAST_IMAGE_ID, IMAGE_OWNER }
+            };
+    }
+
+    @Override
+    @DataProvider(name = "fromImageDescriptionPattern")
+    public Object[][] cloudAndImageDescriptionPatterns() {
+        return new Object[][] {
+                new Object[] { EUWEST_REGION_NAME, IMAGE_PATTERN, IMAGE_OWNER },
+                new Object[] { USEAST_REGION_NAME, IMAGE_PATTERN, IMAGE_OWNER }
+            };
+    }
+
+    @Override
+    @DataProvider(name = "fromImageNamePattern")
+    public Object[][] cloudAndImageNamePatterns() {
+        return new Object[][] {
+                new Object[] { USEAST_REGION_NAME, IMAGE_PATTERN, IMAGE_OWNER }
+            };
+    }
+
+    @Test(enabled = false)
+    public void noop() { } /* just exists to let testNG IDE run the test */
+}


[14/50] brooklyn-server git commit: JcloudsLocationTest: fix indent

Posted by he...@apache.org.
JcloudsLocationTest: fix indent


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

Branch: refs/heads/0.6.0
Commit: 2fc1caf06acfcb46bcf99d19d60df35244607335
Parents: be4ab78
Author: Aled Sage <al...@gmail.com>
Authored: Wed Nov 6 11:07:33 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Nov 6 11:46:46 2013 +0000

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocationTest.java   | 63 ++++++++++----------
 1 file changed, 32 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2fc1caf0/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
index fbdd9b1..b859a23 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
@@ -73,40 +73,41 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
     }
     
     public static class BailOutWithTemplateJcloudsLocation extends JcloudsLocation {
-         ConfigBag lastConfigBag;
-         Template template;
+        ConfigBag lastConfigBag;
+        Template template;
 
-         public BailOutWithTemplateJcloudsLocation() {
+        public BailOutWithTemplateJcloudsLocation() {
             super();
-         }
-        
-         public BailOutWithTemplateJcloudsLocation(Map<?, ?> conf) {
-             super(conf);
-         }
-         
-         @Override
-         protected Template buildTemplate(ComputeService computeService, ConfigBag config) {
-             template = super.buildTemplate(computeService, config);
-             
-             lastConfigBag = config;
-             throw BAIL_OUT_FOR_TESTING;
-         }
-         protected synchronized void tryObtainAndCheck(Map<?,?> flags, Predicate<ConfigBag> test) {
-             try {
-                 obtain(flags);
-             } catch (Throwable e) {
-                 if (e==BAIL_OUT_FOR_TESTING) {
-                     test.apply(lastConfigBag);
-                 } else {
-                     throw Exceptions.propagate(e);
-                 }
-             }
-         }
+        }
+
+        public BailOutWithTemplateJcloudsLocation(Map<?, ?> conf) {
+            super(conf);
+        }
+
+        @Override
+        protected Template buildTemplate(ComputeService computeService, ConfigBag config) {
+            template = super.buildTemplate(computeService, config);
+
+            lastConfigBag = config;
+            throw BAIL_OUT_FOR_TESTING;
+        }
+
+        protected synchronized void tryObtainAndCheck(Map<?,?> flags, Predicate<ConfigBag> test) {
+            try {
+                obtain(flags);
+            } catch (Throwable e) {
+                if (e == BAIL_OUT_FOR_TESTING) {
+                    test.apply(lastConfigBag);
+                } else {
+                    throw Exceptions.propagate(e);
+                }
+            }
+        }
          
-         public Template getTemplate() {
-             return template;
-         }
-     }
+        public Template getTemplate() {
+            return template;
+        }
+    }
     
     protected BailOutJcloudsLocation newSampleBailOutJcloudsLocationForTesting() {
         return managementContext.getLocationManager().createLocation(LocationSpec.create(BailOutJcloudsLocation.class)


[13/50] brooklyn-server git commit: Merge pull request #995 from aledsage/feature/EnricherSpec

Posted by he...@apache.org.
Merge pull request #995 from aledsage/feature/EnricherSpec

Adds EnricherSpec, and adds config to Enricher

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

Branch: refs/heads/0.6.0
Commit: be4ab7842a01fd5117bd4eb4c868379250b60e26
Parents: 3412487 0e74b12
Author: Aled Sage <al...@gmail.com>
Authored: Tue Nov 5 08:32:52 2013 -0800
Committer: Aled Sage <al...@gmail.com>
Committed: Tue Nov 5 08:32:52 2013 -0800

----------------------------------------------------------------------
 .../brooklyn/entity/proxying/EntitySpec.java    |  41 +++-
 api/src/main/java/brooklyn/policy/Enricher.java |  31 ++-
 .../main/java/brooklyn/policy/EnricherSpec.java | 175 ++++++++++++++++
 .../main/java/brooklyn/policy/EnricherType.java |  38 ++++
 api/src/main/java/brooklyn/policy/Policy.java   |   2 +
 .../main/java/brooklyn/policy/PolicyType.java   |   2 +-
 .../enricher/basic/AbstractEnricher.java        |  36 +---
 .../entity/proxying/InternalEntityFactory.java  |  10 +
 .../entity/proxying/InternalPolicyFactory.java  |  71 ++++++-
 .../policy/basic/AbstractEntityAdjunct.java     | 198 ++++++++++++++++++-
 .../brooklyn/policy/basic/AbstractPolicy.java   | 156 +--------------
 .../java/brooklyn/policy/basic/AdjunctType.java | 156 +++++++++++++++
 .../brooklyn/policy/basic/ConfigMapImpl.java    | 173 ++++++++++++++++
 .../brooklyn/policy/basic/EnricherTypeImpl.java |  57 ++++++
 .../brooklyn/policy/basic/PolicyConfigMap.java  | 141 +------------
 .../brooklyn/policy/basic/PolicyTypeImpl.java   | 123 ++----------
 .../brooklyn/entity/basic/EntitySpecTest.java   |  42 +++-
 .../policy/basic/EnricherConfigTest.java        | 167 ++++++++++++++++
 .../brooklyn/policy/basic/EnricherTypeTest.java |  41 ++++
 19 files changed, 1226 insertions(+), 434 deletions(-)
----------------------------------------------------------------------



[04/50] brooklyn-server git commit: Fixed addition of elasticsearch dependency that had broken whirr/base/pom.xml

Posted by he...@apache.org.
Fixed addition of elasticsearch dependency that had broken whirr/base/pom.xml


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

Branch: refs/heads/0.6.0
Commit: d0851ba72bb06ab19094bcd96aa13be4c6567b14
Parents: 87f47cf
Author: Martin Harris <gi...@nakomis.com>
Authored: Fri Nov 1 17:04:51 2013 +0000
Committer: Martin Harris <gi...@nakomis.com>
Committed: Fri Nov 1 17:04:51 2013 +0000

----------------------------------------------------------------------
 systems/whirr/base/pom.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d0851ba7/systems/whirr/base/pom.xml
----------------------------------------------------------------------
diff --git a/systems/whirr/base/pom.xml b/systems/whirr/base/pom.xml
index 4dc3ea5..799fef1 100644
--- a/systems/whirr/base/pom.xml
+++ b/systems/whirr/base/pom.xml
@@ -152,6 +152,7 @@
             <artifactId>whirr-elasticsearch</artifactId>
             <version>${whirr.version}</version>
             <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>


[47/50] brooklyn-server git commit: Fix JcloudsLocationRebindTest.testRebindVm

Posted by he...@apache.org.
Fix JcloudsLocationRebindTest.testRebindVm

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

Branch: refs/heads/0.6.0
Commit: 78ae08230cfed1bf3ea8cb4fffaf0465c85f1eba
Parents: 7029c37
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 15 15:25:40 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 15 15:25:40 2013 +0000

----------------------------------------------------------------------
 .../java/brooklyn/location/jclouds/JcloudsLocation.java   |  4 ++--
 .../location/jclouds/JcloudsLocationRebindTest.java       | 10 ++++++----
 2 files changed, 8 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78ae0823/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 636f825..bff1df5 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -1022,11 +1022,11 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         try {
             if (setup.getDescription()==null) setCreationString(setup);
             
-            String unqualifiedId = (String) checkNotNull(setup.getStringKey("id"), "id");
+            String rawId = (String) checkNotNull(setup.getStringKey("id"), "id");
             String hostname = (String) setup.getStringKey("hostname");
             String user = checkNotNull(getUser(setup), "user");
             String region = (String) setup.getStringKey("region");
-            String id = ((region != null) ? region+"/" : "") + unqualifiedId;
+            String id = rawId.contains("/") ? rawId : (((region != null) ? region+"/" : "") + rawId);
             
             LOG.info("Rebinding to VM {} ({}@{}), in jclouds location for provider {}", 
                     new Object[] {id, user, (hostname != null ? hostname : "<unspecified>"), getProvider()});

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/78ae0823/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindTest.java
index cc5f53d..16d617c 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindTest.java
@@ -1,5 +1,7 @@
 package brooklyn.location.jclouds;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -85,10 +87,10 @@ public class JcloudsLocationRebindTest {
         JcloudsSshMachineLocation machine = obtainMachine(ImmutableMap.of("imageId", EUWEST_IMAGE_ID, "imageOwner", IMAGE_OWNER));
         assertTrue(machine.isSshable());
 
-        String id = machine.getJcloudsId();
-        InetAddress address = machine.getAddress();
-        String hostname = address.getHostName();
-        String user = machine.getUser();
+        String id = checkNotNull(machine.getJcloudsId(), "id");
+        InetAddress address = checkNotNull(machine.getAddress(), "address");
+        String hostname = checkNotNull(address.getHostName(), "hostname");
+        String user = checkNotNull(machine.getUser(), "user");
         
         // Create a new jclouds location, and re-bind the existing VM to that
         JcloudsLocation loc2 = (JcloudsLocation) managementContext.getLocationRegistry().resolve(PROVIDER+":"+EUWEST_REGION_NAME);


[16/50] brooklyn-server git commit: Add JcloudsLocation.MAX_CONCURRENT_MACHINE_CREATIONS

Posted by he...@apache.org.
Add JcloudsLocation.MAX_CONCURRENT_MACHINE_CREATIONS

- Prevent more than the given number of concurrent calls to create
  VMs for a given JcloudsLocation instance.
- Required in various clouds (sometimes, at least!) such as aws-ec2
  where one gets http response 503 RequestLimitExceeded when trying to
  provision 18 machines concurrently.


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

Branch: refs/heads/0.6.0
Commit: 4265e66496e379f1d0a367cdcd5f5bcc4dfe7a12
Parents: 2fc1caf
Author: Aled Sage <al...@gmail.com>
Authored: Wed Oct 30 11:06:03 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Nov 6 16:12:02 2013 +0000

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocation.java       |  56 ++++--
 .../location/jclouds/JcloudsLocationConfig.java |   7 +
 .../location/jclouds/JcloudsLocationTest.java   | 191 +++++++++++++++++--
 3 files changed, 224 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4265e664/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 135cbcd..736a461 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -19,6 +19,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -162,6 +164,14 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         }
         
         setCreationString(getConfigBag());
+        
+        if (getConfig(MACHINE_CREATION_SEMAPHORE) == null) {
+            Integer maxConcurrent = getConfig(MAX_CONCURRENT_MACHINE_CREATIONS);
+            if (maxConcurrent == null || maxConcurrent < 1) {
+                throw new IllegalStateException(MAX_CONCURRENT_MACHINE_CREATIONS.getName() + " must be >= 1, but was "+maxConcurrent);
+            }
+            setConfig(MACHINE_CREATION_SEMAPHORE, new Semaphore(maxConcurrent, true));
+        }
     }
     
     @Override
@@ -178,7 +188,8 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         return getManagementContext().getLocationManager().createLocation(LocationSpec.create(getClass())
                 .parent(this)
                 .configure(getRawLocalConfigBag().getAllConfig())
-                .configure(newFlags));
+                .configure(newFlags)
+                .configure(MACHINE_CREATION_SEMAPHORE, getMachineCreationSemaphore()));
     }
 
     @Override
@@ -232,6 +243,10 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                 USER, JCLOUDS_KEY_USERNAME);
     }
     
+    protected Semaphore getMachineCreationSemaphore() {
+        return checkNotNull(getConfig(MACHINE_CREATION_SEMAPHORE), MACHINE_CREATION_SEMAPHORE.getName());
+    }
+    
     protected Collection<JcloudsLocationCustomizer> getCustomizers(ConfigBag setup) {
         JcloudsLocationCustomizer customizer = setup.get(JCLOUDS_LOCATION_CUSTOMIZER);
         Collection<JcloudsLocationCustomizer> customizers = setup.get(JCLOUDS_LOCATION_CUSTOMIZERS);
@@ -386,19 +401,36 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         try {
             LOG.info("Creating VM in "+setup.getDescription()+" for "+this);
 
-            Template template = buildTemplate(computeService, setup);
-            LoginCredentials initialCredentials = initUserTemplateOptions(template, setup);
-            for (JcloudsLocationCustomizer customizer : getCustomizers(setup)) {
-                customizer.customize(this, computeService, template.getOptions());
+            LoginCredentials initialCredentials;
+            Set<? extends NodeMetadata> nodes;
+            Semaphore machineCreationSemaphore = getMachineCreationSemaphore();
+            boolean acquired = machineCreationSemaphore.tryAcquire(0, TimeUnit.SECONDS);
+            if (!acquired) {
+                LOG.info("Waiting in {} for machine-creation permit ({} other queuing requests already)", new Object[] {this, machineCreationSemaphore.getQueueLength()});
+                Stopwatch stopwatch = new Stopwatch().start();
+                machineCreationSemaphore.acquire();
+                LOG.info("Acquired in {} machine-creation permit, after waiting {}", this, Time.makeTimeStringRounded(stopwatch));
+            } else {
+                LOG.info("Acquired in {} machine-creation permit immediately", this);
+            }
+            try {
+                Template template = buildTemplate(computeService, setup);
+                initialCredentials = initUserTemplateOptions(template, setup);
+                for (JcloudsLocationCustomizer customizer : getCustomizers(setup)) {
+                    customizer.customize(this, computeService, template.getOptions());
+                }
+                LOG.debug("jclouds using template {} / options {} to provision machine in {}", new Object[] {
+                        template, template.getOptions(), setup.getDescription()});
+    
+                if (!setup.getUnusedConfig().isEmpty())
+                    LOG.debug("NOTE: unused flags passed to obtain VM in "+setup.getDescription()+": "+
+                            setup.getUnusedConfig());
+                
+                nodes = computeService.createNodesInGroup(groupId, 1, template);
+            } finally {
+                machineCreationSemaphore.release();
             }
-            LOG.debug("jclouds using template {} / options {} to provision machine in {}", new Object[] {
-                    template, template.getOptions(), setup.getDescription()});
-
-            if (!setup.getUnusedConfig().isEmpty())
-                LOG.debug("NOTE: unused flags passed to obtain VM in "+setup.getDescription()+": "+
-                        setup.getUnusedConfig());
             
-            Set<? extends NodeMetadata> nodes = computeService.createNodesInGroup(groupId, 1, template);
             node = Iterables.getOnlyElement(nodes, null);
             LOG.debug("jclouds created {} for {}", node, setup.getDescription());
             if (node == null)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4265e664/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
index c634482..b01a355 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationConfig.java
@@ -2,6 +2,7 @@ package brooklyn.location.jclouds;
 
 import java.io.File;
 import java.util.Collection;
+import java.util.concurrent.Semaphore;
 
 import org.jclouds.Constants;
 import org.jclouds.compute.domain.TemplateBuilder;
@@ -143,6 +144,12 @@ public interface JcloudsLocationConfig extends CloudLocationConfig {
     public static final ConfigKey<Integer> MACHINE_CREATE_ATTEMPTS = ConfigKeys.newIntegerConfigKey(
             "machineCreateAttempts", "Number of times to retry if jclouds fails to create a VM", 1);
 
+    public static final ConfigKey<Integer> MAX_CONCURRENT_MACHINE_CREATIONS = ConfigKeys.newIntegerConfigKey(
+            "maxConcurrentMachineCreations", "Maximum number of concurrent machine-creations", Integer.MAX_VALUE);
+
+    public static final ConfigKey<Semaphore> MACHINE_CREATION_SEMAPHORE = ConfigKeys.newConfigKey(
+            Semaphore.class, "machineCreationSemaphore", "Semaphore for controlling concurrent machine creation", null);
+
     // TODO
     
 //  "noDefaultSshKeys" - hints that local ssh keys should not be read as defaults

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4265e664/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
index b859a23..aaf9734 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationTest.java
@@ -1,6 +1,11 @@
 package brooklyn.location.jclouds;
 
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.annotation.Nullable;
 
@@ -13,18 +18,22 @@ import org.testng.annotations.Test;
 
 import brooklyn.config.BrooklynProperties;
 import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.location.LocationSpec;
 import brooklyn.location.NoMachinesAvailableException;
 import brooklyn.management.internal.LocalManagementContext;
+import brooklyn.test.Asserts;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.exceptions.Exceptions;
 
+import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.common.reflect.TypeToken;
 
 /**
  * @author Shane Witbeck
@@ -35,6 +44,8 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
             new RuntimeException("early termination for test");
     
     public static class BailOutJcloudsLocation extends JcloudsLocation {
+        public static final ConfigKey<Function<ConfigBag,Void>> BUILD_TEMPLATE_INTERCEPTOR = ConfigKeys.newConfigKey(new TypeToken<Function<ConfigBag,Void>>() {}, "buildtemplateinterceptor");
+        
         ConfigBag lastConfigBag;
 
         public BailOutJcloudsLocation() {
@@ -48,9 +59,10 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
         @Override
         protected Template buildTemplate(ComputeService computeService, ConfigBag config) {
             lastConfigBag = config;
+            if (getConfig(BUILD_TEMPLATE_INTERCEPTOR) != null) getConfig(BUILD_TEMPLATE_INTERCEPTOR).apply(config);
             throw BAIL_OUT_FOR_TESTING;
         }
-        protected synchronized void tryObtainAndCheck(Map<?,?> flags, Predicate<ConfigBag> test) {
+        protected void tryObtainAndCheck(Map<?,?> flags, Predicate<? super ConfigBag> test) {
             try {
                 obtain(flags);
             } catch (NoMachinesAvailableException e) {
@@ -110,34 +122,49 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
     }
     
     protected BailOutJcloudsLocation newSampleBailOutJcloudsLocationForTesting() {
+        return newSampleBailOutJcloudsLocationForTesting(ImmutableMap.<ConfigKey<?>,Object>of());
+    }
+    
+    protected BailOutJcloudsLocation newSampleBailOutJcloudsLocationForTesting(Map<?,?> config) {
+        Map<ConfigKey<?>,?> allConfig = MutableMap.<ConfigKey<?>,Object>builder()
+                .put(IMAGE_ID, "bogus")
+                .put(CLOUD_PROVIDER, "aws-ec2")
+                .put(ACCESS_IDENTITY, "bogus")
+                .put(CLOUD_REGION_ID, "bogus")
+                .put(ACCESS_CREDENTIAL, "bogus")
+                .put(USER, "fred")
+                .put(MIN_RAM, 16)
+                .putAll((Map)config)
+                .build();
         return managementContext.getLocationManager().createLocation(LocationSpec.create(BailOutJcloudsLocation.class)
-                .configure(MutableMap.of(
-                        IMAGE_ID, "bogus",
-                        CLOUD_PROVIDER, "aws-ec2",
-                        ACCESS_IDENTITY, "bogus",
-                        CLOUD_REGION_ID, "bogus",
-                        ACCESS_CREDENTIAL, "bogus",
-                        USER, "fred",
-                        MIN_RAM, 16)));
+                .configure(allConfig));
     }
     
     protected BailOutWithTemplateJcloudsLocation newSampleBailOutWithTemplateJcloudsLocation() {
+        return newSampleBailOutWithTemplateJcloudsLocation(ImmutableMap.<ConfigKey<?>,Object>of());
+    }
+
+    protected BailOutWithTemplateJcloudsLocation newSampleBailOutWithTemplateJcloudsLocation(Map<?,?> config) {
         String identity = (String) brooklynProperties.get("brooklyn.location.jclouds.aws-ec2.identity");
         if (identity == null) identity = (String) brooklynProperties.get("brooklyn.jclouds.aws-ec2.identity");
         String credential = (String) brooklynProperties.get("brooklyn.location.jclouds.aws-ec2.credential");
         if (credential == null) identity = (String) brooklynProperties.get("brooklyn.jclouds.aws-ec2.credential");
         
+        Map<ConfigKey<?>,?> allConfig = MutableMap.<ConfigKey<?>,Object>builder()
+                .put(CLOUD_PROVIDER, "aws-ec2")
+                .put(CLOUD_REGION_ID, "eu-west-1")
+                .put(IMAGE_ID, "us-east-1/ami-7d7bfc14") // so it runs faster, without loading all EC2 images
+                .put(ACCESS_IDENTITY, identity)
+                .put(ACCESS_CREDENTIAL, credential)
+                .put(USER, "fred")
+                .put(INBOUND_PORTS, "[22, 80, 9999]")
+                .putAll((Map)config)
+                .build();
+        
         return managementContext.getLocationManager().createLocation(LocationSpec.create(BailOutWithTemplateJcloudsLocation.class)
-                .configure(MutableMap.of(
-                        CLOUD_PROVIDER, "aws-ec2",
-                        CLOUD_REGION_ID, "eu-west-1",
-                        IMAGE_ID, "us-east-1/ami-7d7bfc14", // so it runs faster, without loading all EC2 images
-                        ACCESS_IDENTITY, identity,
-                        ACCESS_CREDENTIAL, credential,
-                        USER, "fred",
-                        INBOUND_PORTS, "[22, 80, 9999]")));
+                .configure(allConfig));
     }
-    
+
     public static Predicate<ConfigBag> checkerFor(final String user, final Integer minRam, final Integer minCores) {
         return new Predicate<ConfigBag>() {
             @Override
@@ -266,5 +293,133 @@ public class JcloudsLocationTest implements JcloudsLocationConfig {
         Assert.assertEquals(jcloudsLocation.template.getOptions().getInboundPorts(), ports);
     }
 
+    @Test
+    public void testCreateWithMaxConcurrentCallsUnboundedByDefault() throws Exception {
+        final int numCalls = 20;
+        ConcurrencyTracker interceptor = new ConcurrencyTracker();
+        ExecutorService executor = Executors.newCachedThreadPool();
+
+        try {
+            final BailOutJcloudsLocation jcloudsLocation = newSampleBailOutJcloudsLocationForTesting(ImmutableMap.of(BailOutJcloudsLocation.BUILD_TEMPLATE_INTERCEPTOR, interceptor));
+            
+            for (int i = 0; i < numCalls; i++) {
+                executor.execute(new Runnable() {
+                    @Override public void run() {
+                        jcloudsLocation.tryObtainAndCheck(MutableMap.of(), Predicates.alwaysTrue());
+                    }});
+            }
+            
+            interceptor.assertCallCountEventually(numCalls);
+            
+            interceptor.unblock();
+            executor.shutdown();
+            executor.awaitTermination(10, TimeUnit.SECONDS);
+            
+        } finally {
+            executor.shutdownNow();
+        }
+    }
+
+    @Test(groups="Integration") // because takes 1 sec
+    public void testCreateWithMaxConcurrentCallsRespectsConfig() throws Exception {
+        final int numCalls = 4;
+        final int maxConcurrentCreations = 2;
+        ConcurrencyTracker interceptor = new ConcurrencyTracker();
+        ExecutorService executor = Executors.newCachedThreadPool();
+        
+        try {
+            final BailOutJcloudsLocation jcloudsLocation = newSampleBailOutJcloudsLocationForTesting(ImmutableMap.of(
+                    BailOutJcloudsLocation.BUILD_TEMPLATE_INTERCEPTOR, interceptor,
+                    JcloudsLocation.MAX_CONCURRENT_MACHINE_CREATIONS, maxConcurrentCreations));
+            
+            for (int i = 0; i < numCalls; i++) {
+                executor.execute(new Runnable() {
+                    @Override public void run() {
+                        jcloudsLocation.tryObtainAndCheck(MutableMap.of(), Predicates.alwaysTrue());
+                    }});
+            }
+            
+            interceptor.assertCallCountEventually(maxConcurrentCreations);
+            interceptor.assertCallCountContinually(maxConcurrentCreations);
+            
+            interceptor.unblock();
+            interceptor.assertCallCountEventually(numCalls);
+            executor.shutdown();
+            executor.awaitTermination(10, TimeUnit.SECONDS);
+            
+        } finally {
+            executor.shutdownNow();
+        }
+    }
+
+    @Test(groups="Integration") // because takes 1 sec
+    public void testCreateWithMaxConcurrentCallsAppliesToSubLocations() throws Exception {
+        final int numCalls = 4;
+        final int maxConcurrentCreations = 2;
+        ConcurrencyTracker interceptor = new ConcurrencyTracker();
+        ExecutorService executor = Executors.newCachedThreadPool();
+
+        try {
+            final BailOutJcloudsLocation jcloudsLocation = newSampleBailOutJcloudsLocationForTesting(ImmutableMap.of(
+                    BailOutJcloudsLocation.BUILD_TEMPLATE_INTERCEPTOR, interceptor,
+                    JcloudsLocation.MAX_CONCURRENT_MACHINE_CREATIONS, maxConcurrentCreations));
+            
+    
+            for (int i = 0; i < numCalls; i++) {
+                final BailOutJcloudsLocation subLocation = (BailOutJcloudsLocation) jcloudsLocation.newSubLocation(MutableMap.of());
+                executor.execute(new Runnable() {
+                    @Override public void run() {
+                        subLocation.tryObtainAndCheck(MutableMap.of(), Predicates.alwaysTrue());
+                    }});
+            }
+            
+            interceptor.assertCallCountEventually(maxConcurrentCreations);
+            interceptor.assertCallCountContinually(maxConcurrentCreations);
+            
+            interceptor.unblock();
+            interceptor.assertCallCountEventually(numCalls);
+            executor.shutdown();
+            executor.awaitTermination(10, TimeUnit.SECONDS);
+
+        } finally {
+            executor.shutdownNow();
+        }
+    }
+
+    public static class ConcurrencyTracker implements Function<ConfigBag,Void> {
+        final AtomicInteger concurrentCallsCounter = new AtomicInteger();
+        final CountDownLatch continuationLatch = new CountDownLatch(1);
+        
+        @Override public Void apply(ConfigBag input) {
+            concurrentCallsCounter.incrementAndGet();
+            try {
+                continuationLatch.await();
+            } catch (InterruptedException e) {
+                throw Exceptions.propagate(e);
+            }
+            return null;
+        }
+        
+        public void unblock() {
+            continuationLatch.countDown();
+        }
+
+        public void assertCallCountEventually(final int expected) {
+            Asserts.succeedsEventually(new Runnable() {
+                @Override public void run() {
+                    Assert.assertEquals(concurrentCallsCounter.get(), expected);
+                }
+            });
+        }
+        
+        public void assertCallCountContinually(final int expected) {
+            Asserts.succeedsContinually(new Runnable() {
+                @Override public void run() {
+                    Assert.assertEquals(concurrentCallsCounter.get(), expected);
+                }
+            });
+        }
+    }
+
     // TODO more tests, where flags come in from resolver, named locations, etc
 }


[27/50] brooklyn-server git commit: Suppress and log exceptions in tearDown test method

Posted by he...@apache.org.
Suppress and log exceptions in tearDown test method


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

Branch: refs/heads/0.6.0
Commit: 4facfeb1825b58ac345a20d90bfe787f85e82f68
Parents: 331cc47
Author: Andrew Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Nov 13 16:29:08 2013 +0000
Committer: Andrew Kennedy <an...@cloudsoftcorp.com>
Committed: Wed Nov 13 16:29:08 2013 +0000

----------------------------------------------------------------------
 .../entity/BrooklynMgmtContextTestSupport.java         | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4facfeb1/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java b/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
index 1e0ff46..bef60ff 100644
--- a/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
+++ b/software/base/src/test/java/brooklyn/entity/BrooklynMgmtContextTestSupport.java
@@ -1,5 +1,7 @@
 package brooklyn.entity;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 
@@ -10,6 +12,8 @@ import brooklyn.test.entity.TestApplication;
 
 public class BrooklynMgmtContextTestSupport {
 
+    private static final Logger LOG = LoggerFactory.getLogger(BrooklynMgmtContextTestSupport.class);
+
     protected TestApplication app;
     protected ManagementContext mgmt;
 
@@ -25,8 +29,13 @@ public class BrooklynMgmtContextTestSupport {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (mgmt != null) Entities.destroyAll(mgmt);
-        mgmt = null;
+        try {
+            if (mgmt != null) Entities.destroyAll(mgmt);
+        } catch (Throwable t) {
+            LOG.error("Caught exception in tearDown method", t);
+        } finally {
+            mgmt = null;
+        }
     }
     
 }


[06/50] brooklyn-server git commit: Policy: very minor typos

Posted by he...@apache.org.
Policy: very minor typos

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

Branch: refs/heads/0.6.0
Commit: 67c7fe5bd650f1fbb56aac9f9260633a6223c265
Parents: 1ed1f10
Author: Aled Sage <al...@gmail.com>
Authored: Mon Nov 4 23:14:56 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 4 23:14:56 2013 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/policy/Policy.java     | 2 ++
 api/src/main/java/brooklyn/policy/PolicyType.java | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/67c7fe5b/api/src/main/java/brooklyn/policy/Policy.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/Policy.java b/api/src/main/java/brooklyn/policy/Policy.java
index 3a20088..6594469 100644
--- a/api/src/main/java/brooklyn/policy/Policy.java
+++ b/api/src/main/java/brooklyn/policy/Policy.java
@@ -17,6 +17,7 @@ public interface Policy extends EntityAdjunct, Rebindable {
     /**
      * A unique id for this policy.
      */
+    @Override
     String getId();
 
     /**
@@ -24,6 +25,7 @@ public interface Policy extends EntityAdjunct, Rebindable {
      *
      * @return the name assigned to the policy.
      */
+    @Override
     String getName();
 
     /**

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/67c7fe5b/api/src/main/java/brooklyn/policy/PolicyType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/policy/PolicyType.java b/api/src/main/java/brooklyn/policy/PolicyType.java
index b76ff1f..ab980ea 100644
--- a/api/src/main/java/brooklyn/policy/PolicyType.java
+++ b/api/src/main/java/brooklyn/policy/PolicyType.java
@@ -8,7 +8,7 @@ import brooklyn.config.ConfigKey;
 import com.google.common.annotations.Beta;
 
 /**
- * Gives type information for an {@link Policy}. It is immutable.
+ * Gives type information for a {@link Policy}. It is immutable.
  * 
  * For policies that can support config keys etc being added on-the-fly,
  * then this PolicyType will be a snapshot and subsequent snapshots will


[46/50] brooklyn-server git commit: Deprecate BrooklynMachinePool

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

- made start at fixing live test, but it still fails; marked as WIP

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

Branch: refs/heads/0.6.0
Commit: 7029c372c5ddd90dc2c70bd7ed8a690d81082cc6
Parents: 408296c
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 15 15:23:48 2013 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 15 15:23:48 2013 +0000

----------------------------------------------------------------------
 .../location/jclouds/BrooklynMachinePool.java   |  4 ++
 .../location/jclouds/pool/MachinePool.java      |  3 ++
 .../pool/JcloudsMachinePoolLiveTest.java        | 51 ++++++++++++++++----
 3 files changed, 49 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7029c372/locations/jclouds/src/main/java/brooklyn/location/jclouds/BrooklynMachinePool.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/BrooklynMachinePool.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/BrooklynMachinePool.java
index 3e7eee8..66ed9e5 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/BrooklynMachinePool.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/BrooklynMachinePool.java
@@ -24,6 +24,10 @@ import brooklyn.util.task.BasicExecutionContext;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 
+/**
+ * @deprecated since 0.6.0; never used in production setting, and thus of dubious value; best avoided as unlikely to be supported in future versions
+ */
+@Deprecated
 public class BrooklynMachinePool extends MachinePool {
 
     private static final Logger log = LoggerFactory.getLogger(BrooklynMachinePool.class);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7029c372/locations/jclouds/src/main/java/brooklyn/location/jclouds/pool/MachinePool.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/pool/MachinePool.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/pool/MachinePool.java
index 2f2588e..971867b 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/pool/MachinePool.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/pool/MachinePool.java
@@ -47,7 +47,10 @@ import com.google.common.collect.Iterables;
  * If underlying provisioning/destroying operations fail, the pool
  * currently may be in an unknown state, currently.
  * If more robustness is needed this can be added.
+ * 
+ * @deprecated since 0.6.0; never used in production setting, and thus of dubious value; best avoided as unlikely to be supported in future versions
  */
+@Deprecated
 public class MachinePool {
     
     private static final Logger log = LoggerFactory.getLogger(MachinePool.class);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7029c372/locations/jclouds/src/test/java/brooklyn/location/jclouds/pool/JcloudsMachinePoolLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/pool/JcloudsMachinePoolLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/pool/JcloudsMachinePoolLiveTest.java
index 4858bfe..8cb1aa7 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/pool/JcloudsMachinePoolLiveTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/pool/JcloudsMachinePoolLiveTest.java
@@ -10,13 +10,16 @@ import org.jclouds.sshj.config.SshjSshClientModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import brooklyn.location.jclouds.pool.JcloudsMachinePoolLiveTest;
-import brooklyn.location.jclouds.pool.MachinePool;
-import brooklyn.location.jclouds.pool.MachinePoolPredicates;
-import brooklyn.location.jclouds.pool.MachineSet;
-import brooklyn.location.jclouds.pool.ReusableMachineTemplate;
+import brooklyn.config.BrooklynProperties;
+import brooklyn.entity.basic.Entities;
+import brooklyn.location.jclouds.JcloudsLocation;
+import brooklyn.management.internal.LocalManagementContext;
+
+import com.google.common.collect.ImmutableSet;
 
 public class JcloudsMachinePoolLiveTest {
 
@@ -56,12 +59,42 @@ public class JcloudsMachinePoolLiveTest {
         return result;
     }
 
-    @Test(groups="Live")
-    public void buildClaimAndDestroy() {
-        ComputeServiceContext context = ContextBuilder.newBuilder("aws-ec2")
+    private LocalManagementContext managementContext;
+    private JcloudsLocation jcloudsLocation;
+    private ComputeServiceContext context;
+    
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception {
+        // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
+        BrooklynProperties brooklynProperties = BrooklynProperties.Factory.newDefault();
+        for (String key : ImmutableSet.copyOf(brooklynProperties.asMapWithStringKeys().keySet())) {
+            if (key.startsWith("brooklyn.jclouds") && !(key.endsWith("identity") || key.endsWith("credential"))) {
+                brooklynProperties.remove(key);
+            }
+            
+            // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
+            if (key.startsWith("brooklyn.ssh")) {
+                brooklynProperties.remove(key);
+            }
+        }
+        
+        managementContext = new LocalManagementContext(brooklynProperties);
+        jcloudsLocation = (JcloudsLocation) managementContext.getLocationRegistry().resolve("aws-ec2:eu-west-1");
+        
+        context = ContextBuilder.newBuilder("aws-ec2")
                 .modules(Arrays.asList(new SshjSshClientModule(), new SLF4JLoggingModule()))
-                .credentials(getRequiredSystemProperty("identity"), getRequiredSystemProperty("credential"))
+                .credentials(jcloudsLocation.getIdentity(), jcloudsLocation.getCredential())
                 .build(ComputeServiceContext.class);
+    }
+    
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        if (managementContext != null) Entities.destroyAll(managementContext);
+        if (context != null) context.close();
+    }
+    
+    @Test(groups={"Live","WIP"})
+    public void buildClaimAndDestroy() {
         ComputeService svc = context.getComputeService();
         SamplePool p = new SamplePool(svc);
         log.info("buildClaimAndDestroy: created pool");