You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sj...@apache.org on 2015/09/14 18:47:58 UTC

[1/6] incubator-brooklyn git commit: Fix reflective construction of user-supplied config suppliers.

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 92c45eab3 -> 7ca278166


Fix reflective construction of user-supplied config suppliers.

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

Branch: refs/heads/master
Commit: 52647af51c17ef9e163fefdecdbfa630d6035451
Parents: 07ec193
Author: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Authored: Thu Sep 10 07:48:52 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 14 15:38:15 2015 +0100

----------------------------------------------------------------------
 .../core/mgmt/internal/BasicExternalConfigSupplierRegistry.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/52647af5/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
index deebd93..4765cda 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
@@ -103,7 +103,7 @@ public class BasicExternalConfigSupplierRegistry implements ExternalConfigSuppli
             try {
                 Class<? extends ExternalConfigSupplier> providerClass = (Class<? extends ExternalConfigSupplier>) classloader.loadClass(providerClassname);
                 Constructor<? extends ExternalConfigSupplier> constructor = providerClass.getConstructor(ManagementContext.class, String.class, Map.class);
-                ExternalConfigSupplier configSupplier = constructor.newInstance(this, name, config);
+                ExternalConfigSupplier configSupplier = constructor.newInstance(mgmt, name, config);
                 addProvider(name, configSupplier);
 
             } catch (Exception e) {


[4/6] incubator-brooklyn git commit: Add testSensorPropagatedWhenMappingUsedSameNameButDifferentType

Posted by sj...@apache.org.
Add testSensorPropagatedWhenMappingUsedSameNameButDifferentType

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

Branch: refs/heads/master
Commit: 4b6188f559dabeffc08d493b5d1fb26cac609f2f
Parents: 92c45ea
Author: Aled Sage <al...@gmail.com>
Authored: Mon Sep 14 16:51:41 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 14 16:51:41 2015 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/enricher/stock/Propagator.java |  1 +
 .../enricher/stock/SensorPropagatingEnricherTest.java  | 13 +++++++++++++
 2 files changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4b6188f5/core/src/main/java/org/apache/brooklyn/enricher/stock/Propagator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Propagator.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Propagator.java
index 195fc9c..0cf601c 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Propagator.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Propagator.java
@@ -197,6 +197,7 @@ public class Propagator extends AbstractEnricher implements SensorEventListener<
     }
 
     private Sensor<?> getDestinationSensor(final Sensor<?> sourceSensor) {
+        // sensor equality includes the type; we want just name-equality so will use predicate.
         Optional<? extends Sensor<?>> mappingSensor = Iterables.tryFind(sensorMapping.keySet(), new Predicate<Sensor<?>>() {
             @Override
             public boolean apply(Sensor<?> sensor) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4b6188f5/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherTest.java
index c938bc2..090b0a4 100644
--- a/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherTest.java
+++ b/core/src/test/java/org/apache/brooklyn/enricher/stock/SensorPropagatingEnricherTest.java
@@ -215,6 +215,19 @@ public class SensorPropagatingEnricherTest extends BrooklynAppUnitTestSupport {
     }
 
     @Test
+    public void testSensorPropagatedWhenMappingUsedSameNameButDifferentType() throws Exception {
+        AttributeSensor<String> origSensor = Sensors.newSensor(String.class, "origSensor");
+        AttributeSensor<Object> sourceSensorFromYaml = Sensors.newSensor(Object.class, "origSensor");
+        AttributeSensor<Object> targetSensor = Sensors.newSensor(Object.class, "newSensor");
+        app.addEnricher(Enrichers.builder()
+                .propagating(ImmutableMap.of(sourceSensorFromYaml, targetSensor))
+                .from(entity)
+                .build());
+        entity.sensors().set(origSensor, "myval");
+        EntityTestUtils.assertAttributeEqualsEventually(app, targetSensor, "myval");
+    }
+    
+    @Test
     public void testPropagateToDynamicSensor() {
         /*
 


[6/6] incubator-brooklyn git commit: This closes #895

Posted by sj...@apache.org.
This closes #895


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

Branch: refs/heads/master
Commit: 7ca27816604f1c16d668024703e859dc746bbb98
Parents: c18e5d1 4b6188f
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Mon Sep 14 17:30:58 2015 +0100
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Mon Sep 14 17:30:58 2015 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/enricher/stock/Propagator.java |  1 +
 .../enricher/stock/SensorPropagatingEnricherTest.java  | 13 +++++++++++++
 2 files changed, 14 insertions(+)
----------------------------------------------------------------------



[2/6] incubator-brooklyn git commit: Support ExternalConfigSupplier without constructor map arg

Posted by sj...@apache.org.
Support ExternalConfigSupplier without constructor map arg

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

Branch: refs/heads/master
Commit: 306c07c2fd4711d118615d72cc7440acf145a081
Parents: b0d321c
Author: Aled Sage <al...@gmail.com>
Authored: Mon Sep 14 16:15:38 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 14 16:42:44 2015 +0100

----------------------------------------------------------------------
 .../BasicExternalConfigSupplierRegistry.java    | 16 ++++--
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 59 ++++++++++++++++++++
 2 files changed, 70 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/306c07c2/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
index 4765cda..6b261db 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BasicExternalConfigSupplierRegistry.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.core.mgmt.internal;
 
-import java.lang.reflect.Constructor;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -28,9 +27,11 @@ import org.apache.brooklyn.core.config.ConfigPredicates;
 import org.apache.brooklyn.core.config.ConfigUtils;
 import org.apache.brooklyn.core.config.external.ExternalConfigSupplier;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.javalang.Reflections;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.Maps;
 
 /**
@@ -101,10 +102,15 @@ public class BasicExternalConfigSupplierRegistry implements ExternalConfigSuppli
             Map<String, Object> config = ConfigUtils.filterForPrefixAndStrip(externalProviderProperties, key + ".");
 
             try {
-                Class<? extends ExternalConfigSupplier> providerClass = (Class<? extends ExternalConfigSupplier>) classloader.loadClass(providerClassname);
-                Constructor<? extends ExternalConfigSupplier> constructor = providerClass.getConstructor(ManagementContext.class, String.class, Map.class);
-                ExternalConfigSupplier configSupplier = constructor.newInstance(mgmt, name, config);
-                addProvider(name, configSupplier);
+                Optional<ExternalConfigSupplier> configSupplier = Reflections.invokeConstructorWithArgs(classloader, providerClassname, mgmt, name, config);
+                if (!configSupplier.isPresent()) {
+                    configSupplier = Reflections.invokeConstructorWithArgs(classloader, providerClassname, mgmt, name);
+                }
+                if (!configSupplier.isPresent()) {
+                    throw new IllegalStateException("No matching constructor found in "+providerClassname);
+                }
+                
+                addProvider(name, configSupplier.get());
 
             } catch (Exception e) {
                 LOG.error("Failed to instantiate external config supplier named '" + name + "': " + e, e);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/306c07c2/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
index 274056c..7f46861 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
@@ -28,6 +28,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.config.external.AbstractExternalConfigSupplier;
+import org.apache.brooklyn.core.config.external.ExternalConfigSupplier;
 import org.apache.brooklyn.core.internal.BrooklynProperties;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
@@ -48,6 +49,7 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
         BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
         props.put("brooklyn.external.myprovider", MyExternalConfigSupplier.class.getName());
         props.put("brooklyn.external.myprovider.mykey", "myval");
+        props.put("brooklyn.external.myproviderWithoutMapArg", MyExternalConfigSupplierWithoutMapArg.class.getName());
         
         return LocalManagementContextForTests.builder(true)
                 .useProperties(props)
@@ -71,6 +73,22 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
     }
     
     @Test
+    public void testExternalisedConfigFromSupplierWithoutMapArg() throws Exception {
+        ConfigKey<String> MY_CONFIG_KEY = ConfigKeys.newStringConfigKey("my.config.key");
+        
+        String yaml = Joiner.on("\n").join(
+            "services:",
+            "- serviceType: org.apache.brooklyn.core.test.entity.TestApplication",
+            "  brooklyn.config:",
+            "    my.config.key: $brooklyn:external(\"myproviderWithoutMapArg\", \"mykey\")");
+        
+        TestApplication app = (TestApplication) createAndStartApplication(new StringReader(yaml));
+        waitForApplicationTasks(app);
+
+        assertEquals(app.getConfig(MY_CONFIG_KEY), "myHardcodedVal");
+    }
+
+    @Test
     public void testWhenExternalisedConfigSupplierDoesNotExist() throws Exception {
         BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
         props.put("brooklyn.external.myprovider", "wrong.classname.DoesNotExist");
@@ -87,6 +105,24 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
         }
     }
     
+    @Test
+    public void testWhenExternalisedConfigSupplierDoesNotHavingRightConstructor() throws Exception {
+        BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
+        props.put("brooklyn.external.myprovider", MyExternalConfigSupplierWithWrongConstructor.class.getName());
+        
+        try {
+            LocalManagementContext mgmt2 = LocalManagementContextForTests.builder(true)
+                    .useProperties(props)
+                    .build();
+            mgmt2.terminate();
+            fail();
+        } catch (Exception e) {
+            if (!e.toString().contains("No matching constructor")) {
+                throw e;
+            }
+        }
+    }
+    
     @Override
     protected Logger getLogger() {
         return log;
@@ -104,4 +140,27 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
             return conf.get(key);
         }
     }
+    
+    public static class MyExternalConfigSupplierWithoutMapArg extends AbstractExternalConfigSupplier {
+        public MyExternalConfigSupplierWithoutMapArg(ManagementContext mgmt, String name) {
+            super(mgmt, name);
+        }
+        
+        @Override public String get(String key) {
+            return key.equals("mykey") ? "myHardcodedVal" : null;
+        }
+    }
+    
+    public static class MyExternalConfigSupplierWithWrongConstructor implements ExternalConfigSupplier {
+        public MyExternalConfigSupplierWithWrongConstructor(double d) {
+        }
+        
+        @Override public String getName() {
+            return "myname";
+        }
+        
+        @Override public String get(String key) {
+            return null;
+        }
+    }
 }


[3/6] incubator-brooklyn git commit: Add external-config unit tests

Posted by sj...@apache.org.
Add external-config unit tests


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

Branch: refs/heads/master
Commit: b0d321cc37f172fdf531fa28ce1f569053eedd80
Parents: 52647af
Author: Aled Sage <al...@gmail.com>
Authored: Mon Sep 14 16:11:50 2015 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Sep 14 16:42:44 2015 +0100

----------------------------------------------------------------------
 .../ExternalConfigSupplierRegistryTest.java     |  72 +++++++++++++
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 107 +++++++++++++++++++
 2 files changed, 179 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0d321cc/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/ExternalConfigSupplierRegistryTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/ExternalConfigSupplierRegistryTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/ExternalConfigSupplierRegistryTest.java
new file mode 100644
index 0000000..1ce0299
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/internal/ExternalConfigSupplierRegistryTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.mgmt.internal;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.fail;
+
+import java.util.Map;
+
+import org.apache.brooklyn.core.config.external.ExternalConfigSupplier;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class ExternalConfigSupplierRegistryTest extends BrooklynAppUnitTestSupport {
+
+    @Test
+    public void testLooksUpSupplier() throws Exception {
+        MyExternalConfigSupplier supplier1 = new MyExternalConfigSupplier(ImmutableMap.of("mykey", "myval1"));
+        mgmt.getExternalConfigProviderRegistry().addProvider("myprovider1", supplier1);
+        assertEquals(mgmt.getExternalConfigProviderRegistry().getConfig("myprovider1", "mykey"), "myval1");
+        assertNull(mgmt.getExternalConfigProviderRegistry().getConfig("myprovider1", "wrongkey"));
+        
+        MyExternalConfigSupplier supplier2 = new MyExternalConfigSupplier(ImmutableMap.of("mykey", "myval2"));
+        mgmt.getExternalConfigProviderRegistry().addProvider("myprovider2", supplier2);
+        assertEquals(mgmt.getExternalConfigProviderRegistry().getConfig("myprovider2", "mykey"), "myval2");
+    }
+
+    @Test
+    public void testExceptionIfSupplierDoesNotExist() throws Exception {
+        try {
+            assertNull(mgmt.getExternalConfigProviderRegistry().getConfig("wrongprovider", "mykey"));
+            fail();
+        } catch (IllegalArgumentException e) {
+            if (!e.toString().contains("No provider found with name")) throw e;
+        }
+    }
+
+    private static class MyExternalConfigSupplier implements ExternalConfigSupplier {
+        private final Map<String, String> conf;
+        
+        public MyExternalConfigSupplier(Map<String, String> conf) {
+            this.conf = conf;
+        }
+        
+        @Override public String getName() {
+            return "myprovider";
+        }
+
+        @Override public String get(String key) {
+            return conf.get(key);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b0d321cc/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
new file mode 100644
index 0000000..274056c
--- /dev/null
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.camp.brooklyn;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.fail;
+
+import java.io.StringReader;
+import java.util.Map;
+
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.config.external.AbstractExternalConfigSupplier;
+import org.apache.brooklyn.core.internal.BrooklynProperties;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
+import org.apache.brooklyn.core.test.entity.TestApplication;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Joiner;
+
+@Test
+public class ExternalConfigYamlTest extends AbstractYamlTest {
+    private static final Logger log = LoggerFactory.getLogger(ExternalConfigYamlTest.class);
+
+    @Override
+    protected LocalManagementContext newTestManagementContext() {
+        BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
+        props.put("brooklyn.external.myprovider", MyExternalConfigSupplier.class.getName());
+        props.put("brooklyn.external.myprovider.mykey", "myval");
+        
+        return LocalManagementContextForTests.builder(true)
+                .useProperties(props)
+                .build();
+    }
+    
+    @Test
+    public void testExternalisedConfigReferencedFromYaml() throws Exception {
+        ConfigKey<String> MY_CONFIG_KEY = ConfigKeys.newStringConfigKey("my.config.key");
+        
+        String yaml = Joiner.on("\n").join(
+            "services:",
+            "- serviceType: org.apache.brooklyn.core.test.entity.TestApplication",
+            "  brooklyn.config:",
+            "    my.config.key: $brooklyn:external(\"myprovider\", \"mykey\")");
+        
+        TestApplication app = (TestApplication) createAndStartApplication(new StringReader(yaml));
+        waitForApplicationTasks(app);
+
+        assertEquals(app.getConfig(MY_CONFIG_KEY), "myval");
+    }
+    
+    @Test
+    public void testWhenExternalisedConfigSupplierDoesNotExist() throws Exception {
+        BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
+        props.put("brooklyn.external.myprovider", "wrong.classname.DoesNotExist");
+        
+        try {
+            LocalManagementContextForTests.builder(true)
+                    .useProperties(props)
+                    .build();
+            fail();
+        } catch (Exception e) {
+            if (Exceptions.getFirstThrowableOfType(e, ClassNotFoundException.class) == null) {
+                throw e;
+            }
+        }
+    }
+    
+    @Override
+    protected Logger getLogger() {
+        return log;
+    }
+    
+    public static class MyExternalConfigSupplier extends AbstractExternalConfigSupplier {
+        private final Map<String, String> conf;
+        
+        public MyExternalConfigSupplier(ManagementContext mgmt, String name, Map<String, String> conf) {
+            super(mgmt, name);
+            this.conf = conf;
+        }
+        
+        @Override public String get(String key) {
+            return conf.get(key);
+        }
+    }
+}


[5/6] incubator-brooklyn git commit: This closes #893

Posted by sj...@apache.org.
This closes #893


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

Branch: refs/heads/master
Commit: c18e5d145ae731afc16cdcebda0f13cc1df9366a
Parents: 92c45ea 306c07c
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Mon Sep 14 17:27:03 2015 +0100
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Mon Sep 14 17:27:03 2015 +0100

----------------------------------------------------------------------
 .../BasicExternalConfigSupplierRegistry.java    |  16 +-
 .../ExternalConfigSupplierRegistryTest.java     |  72 ++++++++
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 166 +++++++++++++++++++
 3 files changed, 249 insertions(+), 5 deletions(-)
----------------------------------------------------------------------