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 2014/11/15 18:07:09 UTC

[1/8] incubator-brooklyn git commit: allow region and endpoint specified as explicit keys to override ones set implicitly

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master 2c7223b35 -> 5d9708615


allow region and endpoint specified as explicit keys to override ones set implicitly


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

Branch: refs/heads/master
Commit: 9fd29505a8217863cd422d53d097fa0169cb35cd
Parents: 9ed1f98
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 00:46:09 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 02:20:55 2014 +0000

----------------------------------------------------------------------
 .../jclouds/JcloudsLocationResolver.java        | 25 +++++++++++---------
 .../jclouds/JcloudsLocationResolverTest.java    | 18 ++++++++++++++
 2 files changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9fd29505/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
index a0daa84..f71a81b 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
@@ -177,17 +177,20 @@ public class JcloudsLocationResolver implements LocationResolver {
         Map jcloudsProperties = new JcloudsPropertiesFromBrooklynProperties().getJcloudsProperties(providerOrApi, regionOrEndpoint, namedLocation, allProperties);
         jcloudsProperties.putAll(locationFlags);
         
-        if (isProvider) {
-            // providers from ServiceLoader take a location (endpoint already configured), and optionally a region name
-            // NB blank might be supplied if spec string is "mycloud:" -- that should be respected, 
-            // whereas no parameter/regionName ie null value -- "mycloud" -- means don't set
-            if (regionOrEndpoint!=null)
-                jcloudsProperties.put(JcloudsLocationConfig.CLOUD_REGION_ID.getName(), regionOrEndpoint);
-        } else {
-            // other "providers" are APIs so take an _endpoint_ (but not a location);
-            // see note above re null here
-            if (regionOrEndpoint!=null)
-                jcloudsProperties.put(JcloudsLocationConfig.CLOUD_ENDPOINT.getName(), regionOrEndpoint);
+        if (regionOrEndpoint!=null) {
+            // apply the regionOrEndpoint (e.g. from the parameter) as appropriate -- but only if it has not been overridden
+            if (isProvider) {
+                // providers from ServiceLoader take a location (endpoint already configured), and optionally a region name
+                // NB blank might be supplied if spec string is "mycloud:" -- that should be respected, 
+                // whereas no parameter/regionName ie null value -- "mycloud" -- means don't set
+                if (regionOrEndpoint!=null && Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_REGION_ID.getName()))))
+                    jcloudsProperties.put(JcloudsLocationConfig.CLOUD_REGION_ID.getName(), regionOrEndpoint);
+            } else {
+                // other "providers" are APIs so take an _endpoint_ (but not a location);
+                // see note above re null here
+                if (regionOrEndpoint!=null && Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_ENDPOINT.getName()))))
+                    jcloudsProperties.put(JcloudsLocationConfig.CLOUD_ENDPOINT.getName(), regionOrEndpoint);
+            }
         }
         
         return managementContext.getLocationManager().createLocation(LocationSpec.create(JcloudsLocation.class)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9fd29505/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationResolverTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationResolverTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationResolverTest.java
index 92b09d1..6196d59 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationResolverTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationResolverTest.java
@@ -35,6 +35,7 @@ import brooklyn.config.BrooklynProperties;
 import brooklyn.location.cloud.CloudLocationConfig;
 import brooklyn.management.internal.LocalManagementContext;
 import brooklyn.test.entity.LocalManagementContextForTests;
+import brooklyn.util.collections.MutableMap;
 
 public class JcloudsLocationResolverTest {
 
@@ -232,6 +233,23 @@ public class JcloudsLocationResolverTest {
         assertJcloudsEquals(resolve("jclouds:rackspace-cloudservers-uk"), "rackspace-cloudservers-uk", null);
     }
 
+    @Test
+    public void testJcloudsRegionOverridesParent() {
+        Map<String, Object> conf;
+        
+        brooklynProperties.put("brooklyn.location.named.softlayer-was", "jclouds:softlayer:was01");
+        brooklynProperties.put("brooklyn.location.named.softlayer-was2", "jclouds:softlayer:was01");
+        brooklynProperties.put("brooklyn.location.named.softlayer-was2.region", "was02");
+        conf = resolve("named:softlayer-was").getAllConfig(true);
+        assertEquals(conf.get("region"), "was01");
+        
+        conf = resolve("named:softlayer-was2").getAllConfig(true);
+        assertEquals(conf.get("region"), "was02");
+        
+        conf = managementContext.getLocationRegistry().resolve("named:softlayer-was2", MutableMap.of("region", "was03")).getAllConfig(true);
+        assertEquals(conf.get("region"), "was03");
+    }
+    
     // TODO Visual inspection test that it logs warnings
     @Test
     public void testLogsWarnings() throws Exception {


[8/8] incubator-brooklyn git commit: This closes #334

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


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

Branch: refs/heads/master
Commit: 5d9708615448be761e87153949c3e5bf6f89a4f2
Parents: 0d12175 1adc562
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 17:06:48 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 17:06:48 2014 +0000

----------------------------------------------------------------------
 .../rebind/PeriodicDeltaChangeListener.java     |  3 +++
 .../persister/FileBasedStoreObjectAccessor.java | 12 +++++++++--
 .../entity/rebind/RebindCatalogItemTest.java    | 21 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[7/8] incubator-brooklyn git commit: This closes #333

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


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

Branch: refs/heads/master
Commit: 0d12175136ecda62eb29076d59c94fadeb630d40
Parents: 2c7223b 7789158
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 17:06:47 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 17:06:47 2014 +0000

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  |  2 +-
 .../entity/rebind/BasicEntityRebindSupport.java |  6 ++--
 .../entity/rebind/dto/BasicEntityMemento.java   | 36 ++++++++++++++++----
 .../java/brooklyn/location/basic/Locations.java |  3 ++
 .../location/jclouds/JcloudsLocation.java       |  6 ++++
 .../jclouds/JcloudsLocationResolver.java        | 25 ++++++++------
 .../jclouds/JcloudsLocationResolverTest.java    | 18 ++++++++++
 .../software/MachineLifecycleEffectorTasks.java |  4 +--
 .../src/main/webapp/assets/js/view/catalog.js   | 21 +++++++++---
 9 files changed, 93 insertions(+), 28 deletions(-)
----------------------------------------------------------------------



[6/8] incubator-brooklyn git commit: better comments for config key and better coercion tests (code review of previous commits)

Posted by he...@apache.org.
better comments for config key and better coercion tests (code review of previous commits)


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

Branch: refs/heads/master
Commit: 7789158063686315374d9d2fe8c5e2498b5503be
Parents: 7f00d67
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 17:05:02 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 17:05:02 2014 +0000

----------------------------------------------------------------------
 .../java/brooklyn/entity/rebind/dto/BasicEntityMemento.java  | 8 ++++----
 core/src/main/java/brooklyn/location/basic/Locations.java    | 1 +
 .../brooklyn/location/jclouds/JcloudsLocationResolver.java   | 4 ++--
 .../entity/software/MachineLifecycleEffectorTasks.java       | 4 +---
 4 files changed, 8 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77891580/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
index 0ef27e1..2d36ee8 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
@@ -197,9 +197,10 @@ public class BasicEntityMemento extends AbstractTreeNodeMemento implements Entit
         }
         ConfigKey<?> resultStatic = getStaticConfigKeys().get(key);
         if (resultStatic!=null) return resultStatic;
-        // if it was a legacy key, if it is added back, drop the legacy reference
         if (result!=null) return result;
-        // can happen on rebind if a key has gone away; it will not be declared in the file or in the 
+        // can come here on rebind if a key has gone away in the class, so create a generic one; 
+        // but if it was previously found to a legacy key (below) which is added back after a regind, 
+        // gnore the legacy description (several lines above) and add the key back from static (code just above)
         log.warn("Config key "+key+": "+LEGACY_KEY_DESCRIPTION);
         return ConfigKeys.newConfigKey(Object.class, key, LEGACY_KEY_DESCRIPTION);
     }
@@ -222,9 +223,8 @@ public class BasicEntityMemento extends AbstractTreeNodeMemento implements Entit
         }
         AttributeSensor<?> resultStatic = (AttributeSensor<?>) getStaticSensorKeys().get(key);
         if (resultStatic!=null) return resultStatic;
-        // if it was a legacy key, if it is added back, drop the legacy reference
         if (result!=null) return result;
-        // can happen on rebind if a key has gone away; it will not be declared in the file or in the 
+        // see notes on legacy config key
         log.warn("Sensor "+key+": "+LEGACY_KEY_DESCRIPTION);
         return Sensors.newSensor(Object.class, key, LEGACY_KEY_DESCRIPTION);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77891580/core/src/main/java/brooklyn/location/basic/Locations.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/Locations.java b/core/src/main/java/brooklyn/location/basic/Locations.java
index 09cef7c..5fadd26 100644
--- a/core/src/main/java/brooklyn/location/basic/Locations.java
+++ b/core/src/main/java/brooklyn/location/basic/Locations.java
@@ -141,6 +141,7 @@ public class Locations {
     }
     
     public static Collection<? extends Location> coerceToCollection(ManagementContext mgmt, Object rawO) {
+        if (rawO==null) return null;
         Object raw = rawO;
         if (raw instanceof Collection) {
             List<Location> result = MutableList.<Location>of();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77891580/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
index f71a81b..5d42da3 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocationResolver.java
@@ -183,12 +183,12 @@ public class JcloudsLocationResolver implements LocationResolver {
                 // providers from ServiceLoader take a location (endpoint already configured), and optionally a region name
                 // NB blank might be supplied if spec string is "mycloud:" -- that should be respected, 
                 // whereas no parameter/regionName ie null value -- "mycloud" -- means don't set
-                if (regionOrEndpoint!=null && Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_REGION_ID.getName()))))
+                if (Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_REGION_ID.getName()))))
                     jcloudsProperties.put(JcloudsLocationConfig.CLOUD_REGION_ID.getName(), regionOrEndpoint);
             } else {
                 // other "providers" are APIs so take an _endpoint_ (but not a location);
                 // see note above re null here
-                if (regionOrEndpoint!=null && Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_ENDPOINT.getName()))))
+                if (Strings.isBlank(Strings.toString(jcloudsProperties.get(JcloudsLocationConfig.CLOUD_ENDPOINT.getName()))))
                     jcloudsProperties.put(JcloudsLocationConfig.CLOUD_ENDPOINT.getName(), regionOrEndpoint);
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77891580/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
index 8381e99..2168693 100644
--- a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
+++ b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
@@ -155,9 +155,7 @@ public abstract class MachineLifecycleEffectorTasks {
                 Collection<? extends Location> locations  = null;
 
                 Object locationsRaw = parameters.getStringKey(LOCATIONS.getName());
-                if (locationsRaw != null) {
-                    locations = Locations.coerceToCollection(entity().getManagementContext(), locationsRaw);
-                }
+                locations = Locations.coerceToCollection(entity().getManagementContext(), locationsRaw);
 
                 if (locations==null) {
                     // null/empty will mean to inherit from parent


[5/8] incubator-brooklyn git commit: Persistence fix for removing and adding same ID catalog item

Posted by he...@apache.org.
Persistence fix for removing and adding same ID catalog item

If a catalog item with the same ID is removed and then added back the delta persister will first update the stored item and then delete it, regardless of the initial order of removal-addition. This may result in the catalog items disappearing from store even though they were just added.

Explicitly remove catalog item with same ID from the removed set if new object is added.


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

Branch: refs/heads/master
Commit: 1adc562d77c86abe765ab15dfad412fd2074a8e2
Parents: 2c7223b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Sat Nov 15 18:08:14 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Sat Nov 15 18:12:07 2014 +0200

----------------------------------------------------------------------
 .../rebind/PeriodicDeltaChangeListener.java     |  3 +++
 .../persister/FileBasedStoreObjectAccessor.java | 12 +++++++++--
 .../entity/rebind/RebindCatalogItemTest.java    | 21 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1adc562d/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
index da35459..3ef3625 100644
--- a/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/brooklyn/entity/rebind/PeriodicDeltaChangeListener.java
@@ -106,6 +106,9 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
         public void add(BrooklynObject instance) {
             BrooklynObjectType type = BrooklynObjectType.of(instance);
             getUnsafeCollectionOfType(type).add(instance);
+            if (type==BrooklynObjectType.CATALOG_ITEM) {
+                removedCatalogItemIds.remove(instance.getId());
+            }
         }
         
         public void addIfNotRemoved(BrooklynObject instance) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1adc562d/core/src/main/java/brooklyn/entity/rebind/persister/FileBasedStoreObjectAccessor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/persister/FileBasedStoreObjectAccessor.java b/core/src/main/java/brooklyn/entity/rebind/persister/FileBasedStoreObjectAccessor.java
index 1793abd..9a74cca 100644
--- a/core/src/main/java/brooklyn/entity/rebind/persister/FileBasedStoreObjectAccessor.java
+++ b/core/src/main/java/brooklyn/entity/rebind/persister/FileBasedStoreObjectAccessor.java
@@ -22,6 +22,9 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Date;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.io.FileUtil;
 import brooklyn.util.text.Strings;
@@ -38,6 +41,7 @@ import com.google.common.io.Files;
  * @author aled
  */
 public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.StoreObjectAccessor {
+    private static final Logger LOG = LoggerFactory.getLogger(FileBasedStoreObjectAccessor.class);
 
     public FileBasedStoreObjectAccessor(File file, String tmpExtension) {
         this.file = file;
@@ -92,8 +96,12 @@ public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.Stor
 
     @Override
     public void delete() {
-        file.delete();
-        tmpFile.delete();
+        if (!file.delete()) {
+            LOG.error("Unable to delete " + file.getAbsolutePath() + ". Probably still locked.");
+        }
+        if (!tmpFile.delete()) {
+            LOG.error("Unable to delete " + tmpFile.getAbsolutePath() + ". Probably still locked.");
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1adc562d/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java
index 93460dc..29266e7 100644
--- a/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java
@@ -32,8 +32,11 @@ import org.testng.annotations.Test;
 
 import brooklyn.camp.lite.CampPlatformWithJustBrooklynMgmt;
 import brooklyn.camp.lite.TestAppAssemblyInstantiator;
+import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.CatalogLoadMode;
+import brooklyn.catalog.internal.BasicBrooklynCatalog;
+import brooklyn.catalog.internal.CatalogDto;
 import brooklyn.config.BrooklynProperties;
 import brooklyn.config.BrooklynServerConfig;
 import brooklyn.entity.proxying.EntitySpec;
@@ -171,6 +174,24 @@ public class RebindCatalogItemTest extends RebindTestFixtureWithApp {
         toTag.tags().removeTag(tag);
     }
 
+    @Test
+    public void testSameCatalogItemIdRemovalAndAdditionRebinds() throws Exception {
+        //The test is not reliable on Windows (doesn't catch the pre-fix problem) -
+        //the store is unable to delete still locked files so the bug doesn't manifest.
+        //TODO investigate if locked files not caused by unclosed streams!
+        String yaml = 
+                "name: rebind-yaml-catalog-item-test\n" +
+                "brooklyn.catalog:\n" +
+                "  version: " + TEST_VERSION + "\n" +
+                "services:\n" +
+                "- type: io.camp.mock:AppServer";
+        BasicBrooklynCatalog catalog = (BasicBrooklynCatalog) origManagementContext.getCatalog();
+        catalog.addItem(yaml);
+        String catalogXml = catalog.toXmlString();
+        catalog.reset(CatalogDto.newDtoFromXmlContents(catalogXml, "Test reset"));
+        rebindAndAssertCatalogsAreEqual();
+    }
+
     private void rebindAndAssertCatalogsAreEqual() {
         try {
             rebind();


[4/8] incubator-brooklyn git commit: catch disappearing definitions of sensors/config between rebinds/version changes, and better error logging then also

Posted by he...@apache.org.
catch disappearing definitions of sensors/config between rebinds/version changes, and better error logging then also


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

Branch: refs/heads/master
Commit: 7f00d677271c4e8e06a63fa19a28d7cf882ce791
Parents: 1bc16cf
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 03:57:41 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 03:57:41 2014 +0000

----------------------------------------------------------------------
 .../entity/rebind/BasicEntityRebindSupport.java |  6 ++--
 .../entity/rebind/dto/BasicEntityMemento.java   | 36 ++++++++++++++++----
 2 files changed, 34 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7f00d677/core/src/main/java/brooklyn/entity/rebind/BasicEntityRebindSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/BasicEntityRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/BasicEntityRebindSupport.java
index 6bb19cb..c2d8532 100644
--- a/core/src/main/java/brooklyn/entity/rebind/BasicEntityRebindSupport.java
+++ b/core/src/main/java/brooklyn/entity/rebind/BasicEntityRebindSupport.java
@@ -40,6 +40,7 @@ import brooklyn.event.feed.AbstractFeed;
 import brooklyn.location.Location;
 import brooklyn.mementos.EntityMemento;
 import brooklyn.policy.basic.AbstractPolicy;
+import brooklyn.util.exceptions.Exceptions;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
@@ -85,8 +86,9 @@ public class BasicEntityRebindSupport extends AbstractBrooklynObjectRebindSuppor
                 @SuppressWarnings("unused") // just to ensure we can load the declared type? or maybe not needed
                 Class<?> type = (key.getType() != null) ? key.getType() : rebindContext.loadClass(key.getTypeName());
                 ((EntityInternal)entity).setAttributeWithoutPublishing((AttributeSensor<Object>)key, value);
-            } catch (ClassNotFoundException e) {
-                throw Throwables.propagate(e);
+            } catch (Exception e) {
+                LOG.warn("Error adding custom sensor "+entry+" when rebinding "+entity+" (rethrowing): "+e);
+                throw Exceptions.propagate(e);
             }
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7f00d677/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
index 3760381..0ef27e1 100644
--- a/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
+++ b/core/src/main/java/brooklyn/entity/rebind/dto/BasicEntityMemento.java
@@ -25,16 +25,20 @@ import java.util.Map;
 
 import org.codehaus.jackson.annotate.JsonAutoDetect;
 import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import brooklyn.basic.BrooklynTypes;
 import brooklyn.config.ConfigKey;
 import brooklyn.entity.Effector;
 import brooklyn.entity.Entity;
 import brooklyn.entity.basic.AbstractEntity;
+import brooklyn.entity.basic.ConfigKeys;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.rebind.RebindSupport;
 import brooklyn.event.AttributeSensor;
 import brooklyn.event.Sensor;
+import brooklyn.event.basic.Sensors;
 import brooklyn.mementos.EntityMemento;
 import brooklyn.mementos.TreeNode;
 
@@ -54,6 +58,8 @@ import com.google.common.collect.Maps;
 @JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE)
 public class BasicEntityMemento extends AbstractTreeNodeMemento implements EntityMemento, Serializable {
 
+    private static final Logger log = LoggerFactory.getLogger(BasicEntityMemento.class);
+    
     private static final long serialVersionUID = 8642959541121050126L;
     
     public static Builder builder() {
@@ -180,12 +186,22 @@ public class BasicEntityMemento extends AbstractTreeNodeMemento implements Entit
         return staticConfigKeys;
     }
 
+    final static String LEGACY_KEY_DESCRIPTION = "This item was defined in a different version of this blueprint; metadata unavailable here.";
+    
     protected ConfigKey<?> getConfigKey(String key) {
+        ConfigKey<?> result = null;
         if (configKeys!=null) {
-            ConfigKey<?> ck = configKeys.get(key);
-            if (ck!=null) return ck;
+            result = configKeys.get(key);
+            if (result!=null && !LEGACY_KEY_DESCRIPTION.equals(result.getDescription()))
+                    return result;
         }
-        return getStaticConfigKeys().get(key);
+        ConfigKey<?> resultStatic = getStaticConfigKeys().get(key);
+        if (resultStatic!=null) return resultStatic;
+        // if it was a legacy key, if it is added back, drop the legacy reference
+        if (result!=null) return result;
+        // can happen on rebind if a key has gone away; it will not be declared in the file or in the 
+        log.warn("Config key "+key+": "+LEGACY_KEY_DESCRIPTION);
+        return ConfigKeys.newConfigKey(Object.class, key, LEGACY_KEY_DESCRIPTION);
     }
 
     protected synchronized Map<String, Sensor<?>> getStaticSensorKeys() {
@@ -198,11 +214,19 @@ public class BasicEntityMemento extends AbstractTreeNodeMemento implements Entit
     }
 
     protected AttributeSensor<?> getAttributeKey(String key) {
+        AttributeSensor<?> result=null;
         if (attributeKeys!=null) {
-            AttributeSensor<?> ak = attributeKeys.get(key);
-            if (ak!=null) return ak;
+            result = attributeKeys.get(key);
+            if (result!=null && !LEGACY_KEY_DESCRIPTION.equals(result.getDescription()))
+                return result;
         }
-        return (AttributeSensor<?>) getStaticSensorKeys().get(key);
+        AttributeSensor<?> resultStatic = (AttributeSensor<?>) getStaticSensorKeys().get(key);
+        if (resultStatic!=null) return resultStatic;
+        // if it was a legacy key, if it is added back, drop the legacy reference
+        if (result!=null) return result;
+        // can happen on rebind if a key has gone away; it will not be declared in the file or in the 
+        log.warn("Sensor "+key+": "+LEGACY_KEY_DESCRIPTION);
+        return Sensors.newSensor(Object.class, key, LEGACY_KEY_DESCRIPTION);
     }
 
     /**


[2/8] incubator-brooklyn git commit: catalog js-gui tweaks

Posted by he...@apache.org.
catalog js-gui tweaks

* force server ordering to be respected on refresh, so new default versions show at root
* update applications as well as entities
* fix bug where sometimes on relead, policies would cause errors in browser


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

Branch: refs/heads/master
Commit: 9ed1f9814c46b5347b9880fba0d106c156dd181f
Parents: f143310
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Nov 14 23:58:24 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 02:20:55 2014 +0000

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  |  2 +-
 .../src/main/webapp/assets/js/view/catalog.js   | 21 +++++++++++++++-----
 2 files changed, 17 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9ed1f981/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index 3a21114..674b380 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -604,7 +604,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
     private void checkItemNotExists(CatalogItem<?,?> itemDto, boolean forceUpdate) {
         if (!forceUpdate && getCatalogItemDo(itemDto.getSymbolicName(), itemDto.getVersion()) != null) {
             throw new IllegalStateException("Updating existing catalog entries is forbidden: " +
-                    itemDto.getId() + ":" + itemDto.getVersion() + ". Use forceUpdate argument to override.");
+                    itemDto.getSymbolicName() + ":" + itemDto.getVersion() + ". Use forceUpdate argument to override.");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9ed1f981/usage/jsgui/src/main/webapp/assets/js/view/catalog.js
----------------------------------------------------------------------
diff --git a/usage/jsgui/src/main/webapp/assets/js/view/catalog.js b/usage/jsgui/src/main/webapp/assets/js/view/catalog.js
index 2d6aa8b..7f849af 100644
--- a/usage/jsgui/src/main/webapp/assets/js/view/catalog.js
+++ b/usage/jsgui/src/main/webapp/assets/js/view/catalog.js
@@ -185,7 +185,10 @@ define([
                     .done(function (data, status, xhr) {
                         // Can extract location of new item with:
                         //model.url = Brooklyn.util.pathOf(xhr.getResponseHeader("Location"));
+                        submitButton.button("reset");
+                        self.close();  // one of the calls below should draw a different view
                         parent.loadAccordionItem("entities", data.id);
+                        parent.loadAccordionItem("applications", data.id);
                     })
                     .fail(function (xhr, status, error) {
                         submitButton.button("reset");
@@ -232,6 +235,8 @@ define([
                 location.save()
                     .done(function (newModel) {
                         newModel = new Location.Model(newModel);
+                        submitButton.button("reset");
+                        self.close();  // the call below should draw a different view
                         parent.loadAccordionItem("locations", newModel.id);
                     })
                     .fail(function (response) {
@@ -370,9 +375,9 @@ define([
     
     var AccordionEntityView = AccordionItemView.extend({
         renderEntries: function() {
-            var symbolicNameFn = function(model) {return model.get("type")};
+            var symbolicNameFn = function(model) {return model.get("symbolicName")};
             var groups = this.collection.groupBy(symbolicNameFn);
-            var orderedIds = _.uniq(this.collection.map(symbolicNameFn), true);
+            var orderedIds = _.uniq(this.collection.map(symbolicNameFn));
 
             function getLatestStableVersion(items) {
                 //the server sorts items by descending version, snapshots at the back
@@ -429,9 +434,13 @@ define([
                     autoOpen: this.options.kind == "entities"
                 }),
                 "policies": new AccordionEntityView({
+                    // TODO needs parsing, and probably its own model
+                    // but cribbing "entity" works for now 
+                    // (and not setting a model can cause errors intermittently)
                     onItemSelected: _.partial(this.showCatalogItem, DetailsEntityHtml),
                     name: "policies",
                     singular: "policy",
+                    model: Entity.Model,
                     autoOpen: this.options.kind == "policies"
                 }),
                 "locations": new AccordionItemView({
@@ -499,13 +508,15 @@ define([
             } else {
                 var accordion = this.accordion[kind];
                 var self = this;
-                accordion.collection.fetch()
+                // reset is needed because we rely on server's ordering;
+                // without it, server additions are placed at end of list
+                accordion.collection.fetch({reset: true})
                     .then(function() {
                         var model = accordion.collection.get(id);
                         if (!model) {
-                            self.setDetailsView(new CatalogItemDetailsView().renderEmpty(
-                                    "No " + accordion.options.singular + " with id: " + id));
+                            // caller probably passed the wrong kind (in case of entity v app, the caller might try both)                        
                         } else {
+                            Backbone.history.navigate("/v1/catalog/"+kind+"/"+id);
                             activeDetailsView = kind;
                             accordion.activeCid = model.cid;
                             accordion.options.onItemSelected(kind, model);


[3/8] incubator-brooklyn git commit: don't cause NPE inside location list coercions (alt fix for recent fix for NPE from where this is invoked in MachineLifecycleTasks), and some notes on jclouds location for softlayer

Posted by he...@apache.org.
don't cause NPE inside location list coercions (alt fix for recent fix for NPE from where this is invoked in MachineLifecycleTasks), and some notes on jclouds location for softlayer


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

Branch: refs/heads/master
Commit: 1bc16cf747d920adffddd354c9ce5b81cd463b7b
Parents: 9fd2950
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 03:50:00 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 03:50:48 2014 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/location/basic/Locations.java      | 2 ++
 .../main/java/brooklyn/location/jclouds/JcloudsLocation.java   | 6 ++++++
 2 files changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1bc16cf7/core/src/main/java/brooklyn/location/basic/Locations.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/Locations.java b/core/src/main/java/brooklyn/location/basic/Locations.java
index c74db74..09cef7c 100644
--- a/core/src/main/java/brooklyn/location/basic/Locations.java
+++ b/core/src/main/java/brooklyn/location/basic/Locations.java
@@ -111,6 +111,8 @@ public class Locations {
     }
 
     public static Location coerce(ManagementContext mgmt, Object rawO) {
+        if (rawO==null)
+            return null;
         if (rawO instanceof Location)
             return (Location)rawO;
         

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1bc16cf7/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 715a8eb..c58d9be 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -888,6 +888,9 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                         if (t instanceof EC2TemplateOptions) {
                             if (v==null) return;
                             ((EC2TemplateOptions)t).userData(v.toString().getBytes());
+                            // TODO avail in next jclouds thanks to @andreaturli
+//                          } else if (t instanceof SoftLayerTemplateOptions) {
+//                              ((SoftLayerTemplateOptions)t).userData(Strings.toString(v));
                         } else {
                             LOG.info("ignoring userDataString({}) in VM creation because not supported for cloud/type ({})", v, t.getClass());
                         }
@@ -897,6 +900,9 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                         if (t instanceof EC2TemplateOptions) {
                             byte[] bytes = toByteArray(v);
                             ((EC2TemplateOptions)t).userData(bytes);
+                          // TODO avail in next jclouds thanks to @andreaturli
+//                        } else if (t instanceof SoftLayerTemplateOptions) {
+//                            ((SoftLayerTemplateOptions)t).userData(Strings.toString(v));
                         } else {
                             LOG.info("ignoring userData({}) in VM creation because not supported for cloud/type ({})", v, t.getClass());
                         }