You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2016/01/15 23:37:45 UTC

[1/5] incubator-brooklyn git commit: Support "externalised config" in catalog definition

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 38d3102b6 -> e431e6ad3


Support "externalised config" in catalog definition


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

Branch: refs/heads/master
Commit: 18cce24fbb2493d91049c0cef650151252b2b652
Parents: dff3014
Author: Ivana Yovcheva <iv...@gmail.com>
Authored: Tue Dec 29 21:48:09 2015 +0200
Committer: Ivana Yovcheva <iv...@gmail.com>
Committed: Mon Jan 11 14:55:50 2016 +0200

----------------------------------------------------------------------
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 60 +++++++++++++++++++-
 .../catalog/internal/BasicBrooklynCatalog.java  | 36 +++++++-----
 2 files changed, 82 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/18cce24f/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java b/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
index 210f158..b5ce9c9 100644
--- a/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
+++ b/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
@@ -25,6 +25,7 @@ import java.io.StringReader;
 import java.util.Map;
 
 import com.google.common.collect.Iterables;
+import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
@@ -33,7 +34,6 @@ 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.location.AbstractLocation;
 import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
 import org.apache.brooklyn.core.mgmt.internal.CampYamlParser;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
@@ -53,15 +53,19 @@ import com.google.common.base.Joiner;
 public class ExternalConfigYamlTest extends AbstractYamlTest {
     private static final Logger log = LoggerFactory.getLogger(ExternalConfigYamlTest.class);
 
+    private static final String OSGI_URL = "https://repository.apache.org/content/groups/snapshots/org/apache/brooklyn/brooklyn-core/0.9.0-SNAPSHOT/brooklyn-core-0.9.0-20160108.142251-126.jar";
+
     @Override
     protected LocalManagementContext newTestManagementContext() {
         BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
         props.put("brooklyn.external.myprovider", MyExternalConfigSupplier.class.getName());
         props.put("brooklyn.external.myprovider.mykey", "myval");
+        props.put("brooklyn.external.myprovider.osgikey", OSGI_URL);
         props.put("brooklyn.external.myproviderWithoutMapArg", MyExternalConfigSupplierWithoutMapArg.class.getName());
 
         return LocalManagementContextForTests.builder(true)
                 .useProperties(props)
+                .disableOsgi(false)
                 .build();
     }
 
@@ -108,6 +112,60 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
         assertEquals(Iterables.getOnlyElement( app.getLocations() ).config().get(MY_CONFIG_KEY), "myval");
     }
 
+    @Test
+    public void testExternalisedCatalogConfigReferencedFromYaml() throws Exception {
+
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "    id: osgi.test",
+                "    itemType: template",
+                "    version: 1.3",
+                "    description: CentOS 6.6 With GUI - 1.3",
+                "    displayName: CentOS 6.6",
+                "    iconUrl: classpath:///centos.png",
+                "    brooklyn.libraries:",
+                "    - $brooklyn:external(\"myprovider\", \"osgikey\")",
+                "",
+                "    item:",
+                "      services:",
+                "      - type: brooklyn.entity.database.mysql.MySqlNode");
+
+        catalog.addItems(yaml);
+
+        for (CatalogItem<Object, Object> item: catalog.getCatalogItems()) {
+            for (CatalogItem.CatalogBundle library: item.getLibraries()) {
+                assertEquals(library.getUrl(), OSGI_URL);
+            }
+        }
+    }
+
+    @Test
+    public void testNonExternalisedCatalogConfigReferencedFromYaml() throws Exception {
+
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  id: osgi.test",
+                "  itemType: template",
+                "  version: 1.3",
+                "  description: CentOS 6.6 With GUI - 1.3",
+                "  displayName: CentOS 6.6",
+                "  iconUrl: classpath:///centos.png",
+                "  brooklyn.libraries:",
+                "  - " + OSGI_URL,
+                "",
+                "  item:",
+                "    services:",
+                "    - type: brooklyn.entity.database.mysql.MySqlNode");
+
+        catalog.addItems(yaml);
+
+        for (CatalogItem<Object, Object> item: catalog.getCatalogItems()) {
+            for (CatalogItem.CatalogBundle library: item.getLibraries()) {
+                assertEquals(library.getUrl(), OSGI_URL);
+            }
+        }
+    }
+
     @Test(groups="Integration")
     public void testExternalisedLocationConfigSetViaProvisioningPropertiesReferencedFromYaml() throws Exception {
         String yaml = Joiner.on("\n").join(

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/18cce24f/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 96cf452..4f44dab 100644
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@ -41,12 +41,14 @@ import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.core.catalog.CatalogPredicates;
 import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes;
 import org.apache.brooklyn.core.location.BasicLocationRegistry;
+import org.apache.brooklyn.core.mgmt.internal.CampYamlParser;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.typereg.BrooklynTypePlanTransformer;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
+import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.AggregateClassLoader;
@@ -360,8 +362,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     private List<CatalogItemDtoAbstract<?,?>> collectCatalogItems(String yaml) {
-        Map<?,?> itemDef = Yamls.getAs(Yamls.parseAll(yaml), Map.class);
-        Map<?,?> catalogMetadata = getFirstAsMap(itemDef, "brooklyn.catalog").orNull();
+        Map<String,?> itemDef = Yamls.getAs(Yamls.parseAll(yaml), Map.class);
+        Map<String,Object> catalogMetadata = (Map<String, Object>) getFirstAsMap(itemDef, "brooklyn.catalog").orNull();
         if (catalogMetadata==null)
             log.warn("No `brooklyn.catalog` supplied in catalog request; using legacy mode for "+itemDef);
         catalogMetadata = MutableMap.copyOf(catalogMetadata);
@@ -376,7 +378,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         catalogMetadata.remove("items");
         if (!itemDef.isEmpty()) {
             log.debug("Reading brooklyn.catalog peer keys as item ('top-level syntax')");
-            Map<String,?> rootItem = MutableMap.of("item", itemDef);
+            Map<String,Object> rootItem = MutableMap.of("item", (Object) itemDef);
             String rootItemYaml = yaml;
             YamlExtract yamlExtract = Yamls.getTextOfYamlAtPath(rootItemYaml, "brooklyn.catalog");
             String match = yamlExtract.withOriginalIndentation(true).withKeyIncluded(true).getMatchedYamlTextOrWarn();
@@ -391,18 +393,26 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     @SuppressWarnings("unchecked")
-    private void collectCatalogItems(String sourceYaml, Map<?,?> itemMetadata, List<CatalogItemDtoAbstract<?, ?>> result, Map<?,?> parentMetadata) {
+    private void collectCatalogItems(String sourceYaml, Map<?,?> itemMetadata, List<CatalogItemDtoAbstract<?, ?>> result, Map<String,?> parentMetadata) {
 
         if (sourceYaml==null) sourceYaml = new Yaml().dump(itemMetadata);
 
-        Map<Object,Object> catalogMetadata = MutableMap.builder().putAll(parentMetadata).putAll(itemMetadata).build();
-        
+        itemMetadata = mgmt.getConfig().getConfig(CampYamlParser.YAML_PARSER_KEY).parse((Map<String, Object>) itemMetadata);
+
+        try {
+            itemMetadata = (Map<String, Object>) Tasks.resolveDeepValue(itemMetadata, Object.class, mgmt.getServerExecutionContext());
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+
+        Map<String,Object> catalogMetadata = MutableMap.<String, Object>builder().putAll(parentMetadata).putAll((Map<? extends String, ?>) itemMetadata).build();
+
         // brooklyn.libraries we treat specially, to append the list, with the child's list preferred in classloading order
         // `libraries` is supported in some places as a legacy syntax; it should always be `brooklyn.libraries` for new apps
         // TODO in 0.8.0 require brooklyn.libraries, don't allow "libraries" on its own
         List<?> librariesNew = MutableList.copyOf(getFirstAs(itemMetadata, List.class, "brooklyn.libraries", "libraries").orNull());
         Collection<CatalogBundle> libraryBundlesNew = CatalogItemDtoAbstract.parseLibraries(librariesNew);
-        
+
         List<?> librariesCombined = MutableList.copyOf(librariesNew)
             .appendAll(getFirstAs(parentMetadata, List.class, "brooklyn.libraries", "libraries").orNull());
         if (!librariesCombined.isEmpty())
@@ -432,8 +442,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
         if (items!=null) {
             int count = 0;
-            for (Map<?,?> i: ((List<Map<?,?>>)items)) {
-                collectCatalogItems(Yamls.getTextOfYamlAtPath(sourceYaml, "items", count).getMatchedYamlTextOrWarn(), 
+            for (Map<?,?> i: ((List<Map<String,Object>>)items)) {
+                collectCatalogItems(Yamls.getTextOfYamlAtPath(sourceYaml, "items", count).getMatchedYamlTextOrWarn(),
                     i, result, catalogMetadata);
                 count++;
             }
@@ -582,12 +592,12 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return oldValue;
     }
 
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromLocal(ManagementContext mgmt, Map<Object, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromLocal(ManagementContext mgmt, Map<String, Object> catalogMetadata) {
         CatalogDto dto = CatalogDto.newNamedInstance("Local Scanned Catalog", "All annotated Brooklyn entities detected in the classpath", "scanning-local-classpath");
         return scanAnnotationsInternal(mgmt, new CatalogDo(dto), catalogMetadata);
     }
     
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromBundles(ManagementContext mgmt, Collection<CatalogBundle> libraries, Map<Object, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromBundles(ManagementContext mgmt, Collection<CatalogBundle> libraries, Map<String, Object> catalogMetadata) {
         CatalogDto dto = CatalogDto.newNamedInstance("Bundles Scanned Catalog", "All annotated Brooklyn entities detected in bundles", "scanning-bundles-classpath-"+libraries.hashCode());
         List<String> urls = MutableList.of();
         for (CatalogBundle b: libraries) {
@@ -608,7 +618,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return scanAnnotationsInternal(mgmt, subCatalog, catalogMetadata);
     }
     
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsInternal(ManagementContext mgmt, CatalogDo subCatalog, Map<Object, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsInternal(ManagementContext mgmt, CatalogDo subCatalog, Map<String, Object> catalogMetadata) {
         // TODO this does java-scanning only;
         // the call when scanning bundles should use the CatalogItem instead and use OSGi when loading for scanning
         // (or another scanning mechanism).  see comments on CatalogClasspathDo.load
@@ -989,7 +999,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         };
     }
     
-    private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final Map<Object, Object> catalogMetadata) {
+    private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final Map<String, Object> catalogMetadata) {
         return new Function<CatalogItemDo<T,SpecT>, CatalogItem<T,SpecT>>() {
             @Override
             public CatalogItem<T,SpecT> apply(@Nullable CatalogItemDo<T,SpecT> item) {


[3/5] incubator-brooklyn git commit: external-config in catalog: avoid parsing items

Posted by al...@apache.org.
external-config in catalog: avoid parsing items

Don’t parse the “item” or “items” section when populating the catalog.
The camp-yaml DSL section in that is only parsed when the blueprint is
actually being used, rather than when populating the catalog.

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

Branch: refs/heads/master
Commit: 4dbbc9cacb211193553eb3ddae9d1c080667508c
Parents: 786db04
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jan 11 15:17:15 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jan 11 15:17:15 2016 +0000

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  | 55 +++++++++++++-------
 1 file changed, 36 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/4dbbc9ca/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 4f44dab..7e0b69e 100644
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@ -362,8 +362,8 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     private List<CatalogItemDtoAbstract<?,?>> collectCatalogItems(String yaml) {
-        Map<String,?> itemDef = Yamls.getAs(Yamls.parseAll(yaml), Map.class);
-        Map<String,Object> catalogMetadata = (Map<String, Object>) getFirstAsMap(itemDef, "brooklyn.catalog").orNull();
+        Map<?,?> itemDef = Yamls.getAs(Yamls.parseAll(yaml), Map.class);
+        Map<?,?> catalogMetadata = getFirstAsMap(itemDef, "brooklyn.catalog").orNull();
         if (catalogMetadata==null)
             log.warn("No `brooklyn.catalog` supplied in catalog request; using legacy mode for "+itemDef);
         catalogMetadata = MutableMap.copyOf(catalogMetadata);
@@ -378,7 +378,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         catalogMetadata.remove("items");
         if (!itemDef.isEmpty()) {
             log.debug("Reading brooklyn.catalog peer keys as item ('top-level syntax')");
-            Map<String,Object> rootItem = MutableMap.of("item", (Object) itemDef);
+            Map<String,?> rootItem = MutableMap.of("item", (Object) itemDef);
             String rootItemYaml = yaml;
             YamlExtract yamlExtract = Yamls.getTextOfYamlAtPath(rootItemYaml, "brooklyn.catalog");
             String match = yamlExtract.withOriginalIndentation(true).withKeyIncluded(true).getMatchedYamlTextOrWarn();
@@ -393,24 +393,41 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     }
 
     @SuppressWarnings("unchecked")
-    private void collectCatalogItems(String sourceYaml, Map<?,?> itemMetadata, List<CatalogItemDtoAbstract<?, ?>> result, Map<String,?> parentMetadata) {
+    private void collectCatalogItems(String sourceYaml, Map<?,?> itemMetadata, List<CatalogItemDtoAbstract<?, ?>> result, Map<?,?> parentMetadata) {
 
         if (sourceYaml==null) sourceYaml = new Yaml().dump(itemMetadata);
 
-        itemMetadata = mgmt.getConfig().getConfig(CampYamlParser.YAML_PARSER_KEY).parse((Map<String, Object>) itemMetadata);
-
-        try {
-            itemMetadata = (Map<String, Object>) Tasks.resolveDeepValue(itemMetadata, Object.class, mgmt.getServerExecutionContext());
-        } catch (Exception e) {
-            throw Exceptions.propagate(e);
+        Map<?, ?> itemMetadataWithoutItemDef = MutableMap.builder()
+                .putAll(itemMetadata)
+                .remove("item")
+                .remove("items")
+                .build();
+        
+        // Parse CAMP-YAML DSL in item metadata (but not in item or items - those will be parsed only when used). 
+        CampYamlParser parser = mgmt.getConfig().getConfig(CampYamlParser.YAML_PARSER_KEY);
+        if (parser != null) {
+            itemMetadataWithoutItemDef = parser.parse((Map<String, Object>) itemMetadataWithoutItemDef);
+            try {
+                itemMetadataWithoutItemDef = (Map<String, Object>) Tasks.resolveDeepValue(itemMetadataWithoutItemDef, Object.class, mgmt.getServerExecutionContext());
+            } catch (Exception e) {
+                throw Exceptions.propagate(e);
+            }
+            
+        } else {
+            log.info("No Camp-YAML parser regsitered for parsing catalog item DSL; skipping DSL-parsing");
         }
 
-        Map<String,Object> catalogMetadata = MutableMap.<String, Object>builder().putAll(parentMetadata).putAll((Map<? extends String, ?>) itemMetadata).build();
+        Map<Object,Object> catalogMetadata = MutableMap.<Object, Object>builder()
+                .putAll(parentMetadata)
+                .putAll(itemMetadataWithoutItemDef)
+                .putIfNotNull("item", itemMetadata.get("item"))
+                .putIfNotNull("items", itemMetadata.get("items"))
+                .build();
 
         // brooklyn.libraries we treat specially, to append the list, with the child's list preferred in classloading order
         // `libraries` is supported in some places as a legacy syntax; it should always be `brooklyn.libraries` for new apps
         // TODO in 0.8.0 require brooklyn.libraries, don't allow "libraries" on its own
-        List<?> librariesNew = MutableList.copyOf(getFirstAs(itemMetadata, List.class, "brooklyn.libraries", "libraries").orNull());
+        List<?> librariesNew = MutableList.copyOf(getFirstAs(itemMetadataWithoutItemDef, List.class, "brooklyn.libraries", "libraries").orNull());
         Collection<CatalogBundle> libraryBundlesNew = CatalogItemDtoAbstract.parseLibraries(librariesNew);
 
         List<?> librariesCombined = MutableList.copyOf(librariesNew)
@@ -423,7 +440,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         // (this load is required for the scan below and I think also for yaml resolution)
         CatalogUtils.installLibraries(mgmt, libraryBundlesNew);
 
-        Boolean scanJavaAnnotations = getFirstAs(itemMetadata, Boolean.class, "scanJavaAnnotations", "scan_java_annotations").orNull();
+        Boolean scanJavaAnnotations = getFirstAs(itemMetadataWithoutItemDef, Boolean.class, "scanJavaAnnotations", "scan_java_annotations").orNull();
         if (scanJavaAnnotations==null || !scanJavaAnnotations) {
             // don't scan
         } else {
@@ -442,9 +459,9 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
         if (items!=null) {
             int count = 0;
-            for (Map<?,?> i: ((List<Map<String,Object>>)items)) {
+            for (Map<?,?> i: ((List<Map<?,?>>)items)) {
                 collectCatalogItems(Yamls.getTextOfYamlAtPath(sourceYaml, "items", count).getMatchedYamlTextOrWarn(),
-                    i, result, catalogMetadata);
+                        i, result, catalogMetadata);
                 count++;
             }
         }
@@ -592,12 +609,12 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return oldValue;
     }
 
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromLocal(ManagementContext mgmt, Map<String, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromLocal(ManagementContext mgmt, Map<?, ?> catalogMetadata) {
         CatalogDto dto = CatalogDto.newNamedInstance("Local Scanned Catalog", "All annotated Brooklyn entities detected in the classpath", "scanning-local-classpath");
         return scanAnnotationsInternal(mgmt, new CatalogDo(dto), catalogMetadata);
     }
     
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromBundles(ManagementContext mgmt, Collection<CatalogBundle> libraries, Map<String, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsFromBundles(ManagementContext mgmt, Collection<CatalogBundle> libraries, Map<?, ?> catalogMetadata) {
         CatalogDto dto = CatalogDto.newNamedInstance("Bundles Scanned Catalog", "All annotated Brooklyn entities detected in bundles", "scanning-bundles-classpath-"+libraries.hashCode());
         List<String> urls = MutableList.of();
         for (CatalogBundle b: libraries) {
@@ -618,7 +635,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         return scanAnnotationsInternal(mgmt, subCatalog, catalogMetadata);
     }
     
-    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsInternal(ManagementContext mgmt, CatalogDo subCatalog, Map<String, Object> catalogMetadata) {
+    private Collection<CatalogItemDtoAbstract<?, ?>> scanAnnotationsInternal(ManagementContext mgmt, CatalogDo subCatalog, Map<?, ?> catalogMetadata) {
         // TODO this does java-scanning only;
         // the call when scanning bundles should use the CatalogItem instead and use OSGi when loading for scanning
         // (or another scanning mechanism).  see comments on CatalogClasspathDo.load
@@ -999,7 +1016,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
         };
     }
     
-    private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final Map<String, Object> catalogMetadata) {
+    private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final Map<?, ?> catalogMetadata) {
         return new Function<CatalogItemDo<T,SpecT>, CatalogItem<T,SpecT>>() {
             @Override
             public CatalogItem<T,SpecT> apply(@Nullable CatalogItemDo<T,SpecT> item) {


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

Posted by al...@apache.org.
This closes #1130


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

Branch: refs/heads/master
Commit: e431e6ad3f47378c9e1c1e035654ed65fc4b4964
Parents: 38d3102 6e84d00
Author: Aled Sage <al...@gmail.com>
Authored: Fri Jan 15 22:37:24 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Jan 15 22:37:24 2016 +0000

----------------------------------------------------------------------
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 114 ++++++++++++++++++-
 .../catalog/internal/BasicBrooklynCatalog.java  |  47 ++++++--
 2 files changed, 149 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e431e6ad/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------


[2/5] incubator-brooklyn git commit: ExternalConfig in catalog: improve tests

Posted by al...@apache.org.
ExternalConfig in catalog: improve 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/786db04f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/786db04f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/786db04f

Branch: refs/heads/master
Commit: 786db04fde914a2544ec09e7c6a12af171cfdbff
Parents: 18cce24
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jan 11 13:27:59 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Jan 11 13:27:59 2016 +0000

----------------------------------------------------------------------
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 100 ++++++++++++++-----
 1 file changed, 76 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/786db04f/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java b/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
index b5ce9c9..66d3cfe 100644
--- a/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
+++ b/brooklyn-server/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ExternalConfigYamlTest.java
@@ -24,8 +24,9 @@ import static org.testng.Assert.fail;
 import java.io.StringReader;
 import java.util.Map;
 
-import com.google.common.collect.Iterables;
 import org.apache.brooklyn.api.catalog.CatalogItem;
+import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
+import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.ExecutionContext;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
@@ -48,21 +49,35 @@ import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
 
 @Test
 public class ExternalConfigYamlTest extends AbstractYamlTest {
     private static final Logger log = LoggerFactory.getLogger(ExternalConfigYamlTest.class);
-
-    private static final String OSGI_URL = "https://repository.apache.org/content/groups/snapshots/org/apache/brooklyn/brooklyn-core/0.9.0-SNAPSHOT/brooklyn-core-0.9.0-20160108.142251-126.jar";
+    
+    // Choose a small jar; it is downloaded in some tests.
+    // Pick an OSGi bundle that is not part of core brooklyn.
+    private static final String LIBRARY_URL = "https://repository.apache.org/content/groups/public/org/apache/logging/log4j/log4j-api/2.5/log4j-api-2.5.jar";
+    private static final String LIBRARY_SYMBOLIC_NAME = "org.apache.logging.log4j.api";
+    private static final String LIBRARY_VERSION = "2.5.0";
 
     @Override
     protected LocalManagementContext newTestManagementContext() {
         BrooklynProperties props = BrooklynProperties.Factory.newEmpty();
         props.put("brooklyn.external.myprovider", MyExternalConfigSupplier.class.getName());
         props.put("brooklyn.external.myprovider.mykey", "myval");
-        props.put("brooklyn.external.myprovider.osgikey", OSGI_URL);
         props.put("brooklyn.external.myproviderWithoutMapArg", MyExternalConfigSupplierWithoutMapArg.class.getName());
 
+        props.put("brooklyn.external.myprovider.myCatalogId", "myId");
+        props.put("brooklyn.external.myprovider.myCatalogItemType", "template");
+        props.put("brooklyn.external.myprovider.myCatalogVersion", "1.2");
+        props.put("brooklyn.external.myprovider.myCatalogDescription", "myDescription");
+        props.put("brooklyn.external.myprovider.myCatalogDisplayName", "myDisplayName");
+        props.put("brooklyn.external.myprovider.myCatalogIconUrl", "classpath:///myIconUrl.png");
+        props.put("brooklyn.external.myprovider.myCatalogLibraryUrl", LIBRARY_URL);
+        props.put("brooklyn.external.myprovider.myCatalogLibraryName", LIBRARY_SYMBOLIC_NAME);
+        props.put("brooklyn.external.myprovider.myCatalogLibraryVersion", LIBRARY_VERSION);
+
         return LocalManagementContextForTests.builder(true)
                 .useProperties(props)
                 .disableOsgi(false)
@@ -112,19 +127,52 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
         assertEquals(Iterables.getOnlyElement( app.getLocations() ).config().get(MY_CONFIG_KEY), "myval");
     }
 
-    @Test
+    // Will download the given catalog library jar
+    @Test(groups="Integration")
     public void testExternalisedCatalogConfigReferencedFromYaml() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "    id: $brooklyn:external(\"myprovider\", \"myCatalogId\")",
+                "    itemType: $brooklyn:external(\"myprovider\", \"myCatalogItemType\")",
+                "    version: $brooklyn:external(\"myprovider\", \"myCatalogVersion\")",
+                "    description: $brooklyn:external(\"myprovider\", \"myCatalogDescription\")",
+                "    displayName: $brooklyn:external(\"myprovider\", \"myCatalogDisplayName\")",
+                "    iconUrl: $brooklyn:external(\"myprovider\", \"myCatalogIconUrl\")",
+                "    brooklyn.libraries:",
+                "    - $brooklyn:external(\"myprovider\", \"myCatalogLibraryUrl\")",
+                "",
+                "    item:",
+                "      services:",
+                "      - type: brooklyn.entity.database.mysql.MySqlNode");
 
+        catalog.addItems(yaml);
+
+        CatalogItem<Object, Object> item = Iterables.getOnlyElement(catalog.getCatalogItems());
+        CatalogBundle bundle = Iterables.getOnlyElement(item.getLibraries());
+        assertEquals(item.getId(), "myId:1.2");
+        assertEquals(item.getCatalogItemType(), CatalogItemType.TEMPLATE);
+        assertEquals(item.getVersion(), "1.2");
+        assertEquals(item.getDescription(), "myDescription");
+        assertEquals(item.getDisplayName(), "myDisplayName");
+        assertEquals(item.getIconUrl(), "classpath:///myIconUrl.png");
+        assertEquals(bundle.getUrl(), LIBRARY_URL);
+    }
+
+    // Will download the given catalog library jar
+    @Test(groups="Integration")
+    public void testExternalisedCatalogConfigReferencedFromYamlWithLibraryMap() throws Exception {
         String yaml = Joiner.on("\n").join(
                 "brooklyn.catalog:",
-                "    id: osgi.test",
+                "    id: myid",
                 "    itemType: template",
-                "    version: 1.3",
-                "    description: CentOS 6.6 With GUI - 1.3",
-                "    displayName: CentOS 6.6",
-                "    iconUrl: classpath:///centos.png",
+                "    version: 1.2",
+                "    description: myDescription",
+                "    displayName: myDisplayName",
+                "    iconUrl: classpath:///myIconUrl.png",
                 "    brooklyn.libraries:",
-                "    - $brooklyn:external(\"myprovider\", \"osgikey\")",
+                "    - name: $brooklyn:external(\"myprovider\", \"myCatalogLibraryName\")",
+                "      version: $brooklyn:external(\"myprovider\", \"myCatalogLibraryVersion\")",
+                "      url: $brooklyn:external(\"myprovider\", \"myCatalogLibraryUrl\")",
                 "",
                 "    item:",
                 "      services:",
@@ -132,16 +180,17 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
 
         catalog.addItems(yaml);
 
-        for (CatalogItem<Object, Object> item: catalog.getCatalogItems()) {
-            for (CatalogItem.CatalogBundle library: item.getLibraries()) {
-                assertEquals(library.getUrl(), OSGI_URL);
-            }
-        }
+        CatalogItem<Object, Object> item = Iterables.getOnlyElement(catalog.getCatalogItems());
+        CatalogBundle bundle = Iterables.getOnlyElement(item.getLibraries());
+        assertEquals(bundle.getUrl(), LIBRARY_URL);
+        assertEquals(bundle.getSymbolicName(), LIBRARY_SYMBOLIC_NAME);
+        assertEquals(bundle.getVersion(), LIBRARY_VERSION);
     }
 
-    @Test
+    // Will download the given catalog library jar
+    // Confirms "normal" behaviour, when all values in the catalog are hard-coded rather than using external config.
+    @Test(groups="Integration")
     public void testNonExternalisedCatalogConfigReferencedFromYaml() throws Exception {
-
         String yaml = Joiner.on("\n").join(
                 "brooklyn.catalog:",
                 "  id: osgi.test",
@@ -151,7 +200,7 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
                 "  displayName: CentOS 6.6",
                 "  iconUrl: classpath:///centos.png",
                 "  brooklyn.libraries:",
-                "  - " + OSGI_URL,
+                "  - " + LIBRARY_URL,
                 "",
                 "  item:",
                 "    services:",
@@ -159,11 +208,14 @@ public class ExternalConfigYamlTest extends AbstractYamlTest {
 
         catalog.addItems(yaml);
 
-        for (CatalogItem<Object, Object> item: catalog.getCatalogItems()) {
-            for (CatalogItem.CatalogBundle library: item.getLibraries()) {
-                assertEquals(library.getUrl(), OSGI_URL);
-            }
-        }
+        CatalogItem<Object, Object> item = Iterables.getOnlyElement(catalog.getCatalogItems());
+        assertEquals(item.getId(), "osgi.test:1.3");
+        assertEquals(item.getCatalogItemType(), CatalogItemType.TEMPLATE);
+        assertEquals(item.getVersion(), "1.3");
+        assertEquals(item.getDescription(), "CentOS 6.6 With GUI - 1.3");
+        assertEquals(item.getDisplayName(), "CentOS 6.6");
+        assertEquals(item.getIconUrl(), "classpath:///centos.png");
+        assertEquals(Iterables.getOnlyElement(item.getLibraries()).getUrl(), LIBRARY_URL);
     }
 
     @Test(groups="Integration")


[4/5] incubator-brooklyn git commit: Merge pull request #1 from aledsage/iyovcheva/externalised-config-in-catalog-definition-aled

Posted by al...@apache.org.
Merge pull request #1 from aledsage/iyovcheva/externalised-config-in-catalog-definition-aled

Externalised config in catalog definition


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

Branch: refs/heads/master
Commit: 6e84d008cb649ed0fb26b4b4e8f6d2a8c3721aef
Parents: 18cce24 4dbbc9c
Author: iyovcheva <iv...@gmail.com>
Authored: Tue Jan 12 10:21:39 2016 +0200
Committer: Ivana Yovcheva <iv...@gmail.com>
Committed: Tue Jan 12 12:02:12 2016 +0200

----------------------------------------------------------------------
 .../camp/brooklyn/ExternalConfigYamlTest.java   | 100 ++++++++++++++-----
 .../catalog/internal/BasicBrooklynCatalog.java  |  55 ++++++----
 2 files changed, 112 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6e84d008/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --cc brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 4f44dab,7e0b69e..81b273e
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@@ -378,7 -378,7 +378,7 @@@ public class BasicBrooklynCatalog imple
          catalogMetadata.remove("items");
          if (!itemDef.isEmpty()) {
              log.debug("Reading brooklyn.catalog peer keys as item ('top-level syntax')");
-             Map<String,Object> rootItem = MutableMap.of("item", (Object) itemDef);
 -            Map<String,?> rootItem = MutableMap.of("item", (Object) itemDef);
++            Map<String,?> rootItem = MutableMap.of("item", itemDef);
              String rootItemYaml = yaml;
              YamlExtract yamlExtract = Yamls.getTextOfYamlAtPath(rootItemYaml, "brooklyn.catalog");
              String match = yamlExtract.withOriginalIndentation(true).withKeyIncluded(true).getMatchedYamlTextOrWarn();