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 2015/11/10 18:12:59 UTC

[1/2] incubator-brooklyn git commit: Add catalog recursion prevention to special flags handling

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 015b5cdf5 -> 2aa01c0f9


Add catalog recursion prevention to special flags handling


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

Branch: refs/heads/master
Commit: 805aae27682a02977476ae57249056341ca30917
Parents: 703354d
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Mon Nov 9 15:09:49 2015 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Mon Nov 9 16:52:26 2015 +0200

----------------------------------------------------------------------
 .../BrooklynComponentTemplateResolver.java      | 21 +++++------
 .../brooklyn/catalog/CatalogYamlAppTest.java    | 38 +++++++++++++++++++-
 2 files changed, 48 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/805aae27/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index a273c50..db6a78e 100644
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -65,7 +65,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 
@@ -226,19 +225,19 @@ public class BrooklynComponentTemplateResolver {
         if (childLocations != null)
             spec.locations(childLocations);
 
-        decorateSpec(spec);
+        decorateSpec(spec, encounteredRegisteredTypeIds);
     }
 
-    private <T extends Entity> void decorateSpec(EntitySpec<T> spec) {
+    private <T extends Entity> void decorateSpec(EntitySpec<T> spec, Set<String> encounteredRegisteredTypeIds) {
         new BrooklynEntityDecorationResolver.PolicySpecResolver(yamlLoader).decorate(spec, attrs);
         new BrooklynEntityDecorationResolver.EnricherSpecResolver(yamlLoader).decorate(spec, attrs);
         new BrooklynEntityDecorationResolver.InitializerResolver(yamlLoader).decorate(spec, attrs);
 
-        configureEntityConfig(spec);
+        configureEntityConfig(spec, encounteredRegisteredTypeIds);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    private void configureEntityConfig(EntitySpec<?> spec) {
+    private void configureEntityConfig(EntitySpec<?> spec, Set<String> encounteredRegisteredTypeIds) {
         // first take *recognised* flags and config keys from the top-level, and put them in the bag (of brooklyn.config)
         // attrs will contain only brooklyn.xxx properties when coming from BrooklynEntityMatcher.
         // Any top-level flags will go into "brooklyn.flags". When resolving a spec from $brooklyn:entitySpec
@@ -263,12 +262,12 @@ public class BrooklynComponentTemplateResolver {
         Set<String> keyNamesUsed = new LinkedHashSet<String>();
         for (FlagConfigKeyAndValueRecord r: records) {
             if (r.getFlagMaybeValue().isPresent()) {
-                Object transformed = new SpecialFlagsTransformer(loader).apply(r.getFlagMaybeValue().get());
+                Object transformed = new SpecialFlagsTransformer(loader, encounteredRegisteredTypeIds).apply(r.getFlagMaybeValue().get());
                 spec.configure(r.getFlagName(), transformed);
                 keyNamesUsed.add(r.getFlagName());
             }
             if (r.getConfigKeyMaybeValue().isPresent()) {
-                Object transformed = new SpecialFlagsTransformer(loader).apply(r.getConfigKeyMaybeValue().get());
+                Object transformed = new SpecialFlagsTransformer(loader, encounteredRegisteredTypeIds).apply(r.getConfigKeyMaybeValue().get());
                 spec.configure((ConfigKey<Object>)r.getConfigKey(), transformed);
                 keyNamesUsed.add(r.getConfigKey().getName());
             }
@@ -281,7 +280,7 @@ public class BrooklynComponentTemplateResolver {
             // we don't let a flag with the same name as a config key override the config key
             // (that's why we check whether it is used)
             if (!keyNamesUsed.contains(key)) {
-                Object transformed = new SpecialFlagsTransformer(loader).apply(bag.getStringKey(key));
+                Object transformed = new SpecialFlagsTransformer(loader, encounteredRegisteredTypeIds).apply(bag.getStringKey(key));
                 spec.configure(ConfigKeys.newConfigKey(Object.class, key.toString()), transformed);
             }
         }
@@ -313,10 +312,12 @@ public class BrooklynComponentTemplateResolver {
          * which can be used to find it from mgmt, rather than pass the loader.
          */
         private BrooklynClassLoadingContext loader = null;
+        private Set<String> encounteredRegisteredTypeIds;
 
-        public SpecialFlagsTransformer(BrooklynClassLoadingContext loader) {
+        public SpecialFlagsTransformer(BrooklynClassLoadingContext loader, Set<String> encounteredRegisteredTypeIds) {
             this.loader = loader;
             mgmt = loader.getManagementContext();
+            this.encounteredRegisteredTypeIds = encounteredRegisteredTypeIds;
         }
         @Override
         public Object apply(Object input) {
@@ -362,7 +363,7 @@ public class BrooklynComponentTemplateResolver {
                 @SuppressWarnings("unchecked")
                 Map<String, Object> resolvedConfig = (Map<String, Object>)transformSpecialFlags(specConfig.getSpecConfiguration());
                 specConfig.setSpecConfiguration(resolvedConfig);
-                return Factory.newInstance(getLoader(), specConfig.getSpecConfiguration()).resolveSpec(ImmutableSet.<String>of());
+                return Factory.newInstance(getLoader(), specConfig.getSpecConfiguration()).resolveSpec(encounteredRegisteredTypeIds);
             }
             if (flag instanceof ManagementContextInjectable) {
                 log.debug("Injecting Brooklyn management context info object: {}", flag);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/805aae27/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
index 30c383d..f4e58be 100644
--- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
+++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
@@ -21,10 +21,18 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 import org.testng.annotations.Test;
 
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
+import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 
 
 public class CatalogYamlAppTest extends AbstractYamlTest {
-    
+
+    @Override
+    protected LocalManagementContext newTestManagementContext() {
+        // Don't need osgi
+        return LocalManagementContextForTests.newInstance();
+    }
+
     /**
      * "Contrived" example was encountered by a customer in a real use-case!
      * I couldn't yet simplify it further while still reproducing the failure.
@@ -70,4 +78,32 @@ public class CatalogYamlAppTest extends AbstractYamlTest {
             deleteCatalogEntity("org.apache.brooklyn.entity.stock.BasicEntity");
         }
     }
+
+    @Test // same as above, but the minimal possible setup
+    public void testAddCatalogItemWithMemberSpecCircularReference() throws Exception {
+        // Add a catalog item with a circular reference to its own id through a $brooklyn:entitySpec
+        addCatalogItems(
+                "brooklyn.catalog:",
+                "  id: org.apache.brooklyn.entity.stock.BasicApplication",
+                "  version: "+TEST_VERSION,
+                "services:",
+                "- type: org.apache.brooklyn.entity.stock.BasicApplication",
+                "  brooklyn.config:",
+                "    memberSpec:",
+                "      $brooklyn:entitySpec:",
+                "      - type: org.apache.brooklyn.entity.stock.BasicApplication");
+
+        try {
+            // Use the blueprint from the catalog that has the circular reference.
+            addCatalogItems(
+                    "brooklyn.catalog:",
+                    "  id: another.app.in.the.catalog",
+                    "  version: "+TEST_VERSION,
+                    "services:",
+                    "- type: org.apache.brooklyn.entity.stock.BasicApplication");
+            deleteCatalogEntity("another.app.in.the.catalog");
+        } finally {
+            deleteCatalogEntity("org.apache.brooklyn.entity.stock.BasicApplication");
+        }
+    }
 }


[2/2] incubator-brooklyn git commit: This closes #1010

Posted by he...@apache.org.
This closes #1010


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

Branch: refs/heads/master
Commit: 2aa01c0f90c5acdf284f990cf7b7f1b4cae28dbb
Parents: 015b5cd 805aae2
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 10 17:08:14 2015 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Nov 10 17:08:14 2015 +0000

----------------------------------------------------------------------
 .../BrooklynComponentTemplateResolver.java      | 21 +++++------
 .../brooklyn/catalog/CatalogYamlAppTest.java    | 38 +++++++++++++++++++-
 2 files changed, 48 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aa01c0f/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --cc usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index c150ddc,db6a78e..69c9109
--- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@@ -233,9 -232,8 +232,9 @@@ public class BrooklynComponentTemplateR
          new BrooklynEntityDecorationResolver.PolicySpecResolver(yamlLoader).decorate(spec, attrs);
          new BrooklynEntityDecorationResolver.EnricherSpecResolver(yamlLoader).decorate(spec, attrs);
          new BrooklynEntityDecorationResolver.InitializerResolver(yamlLoader).decorate(spec, attrs);
 +        new BrooklynEntityDecorationResolver.SpecParameterResolver(yamlLoader).decorate(spec, attrs);
  
-         configureEntityConfig(spec);
+         configureEntityConfig(spec, encounteredRegisteredTypeIds);
      }
  
      @SuppressWarnings({ "unchecked", "rawtypes" })