Repository: brooklyn-server
Updated Branches:
  refs/heads/master d09b58f9f -> ce5ee7b86


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
index 664ddfe..9bc8e94 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento;
 import org.apache.brooklyn.api.objs.BrooklynObjectType;
 
 import com.google.common.collect.Maps;
@@ -46,10 +47,12 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
         protected final Map<String, String> enricherIdToType = 
Maps.newConcurrentMap();
         protected final Map<String, String> feedIdToType = 
Maps.newConcurrentMap();
         protected final Map<String, CatalogItemMemento> catalogItems = 
Maps.newConcurrentMap();
+        protected final Map<String, ManagedBundleMemento> bundles = 
Maps.newConcurrentMap();
 
         public Builder planeId(String planeId) {
             this.planeId = planeId; return this;
         }
+
         /** @deprecated since 0.11.0; value is not used */
         @Deprecated
         public Builder brooklynVersion(String val) {
@@ -89,6 +92,12 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
         public Builder catalogItem(CatalogItemMemento val) {
             catalogItems.put(val.getId(), val); return this;
         }
+        public Builder bundles(Map<String, ManagedBundleMemento> vals) {
+            bundles.putAll(vals); return this;
+        }
+        public Builder bundle(ManagedBundleMemento val) {
+            bundles.put(val.getId(), val); return this;
+        }
 
         public Builder putType(BrooklynObjectType type, String id, String 
javaType) {
             switch (type) {
@@ -97,7 +106,9 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
             case POLICY: return policy(id, javaType);
             case ENRICHER: return enricher(id, javaType);
             case FEED: return feed(id, javaType);
-            case CATALOG_ITEM: throw new 
IllegalArgumentException(type.toCamelCase()+" requires different parameters");
+            case CATALOG_ITEM: 
+            case MANAGED_BUNDLE: 
+                throw new IllegalArgumentException(type.toCamelCase()+" 
requires different parameters");
             case UNKNOWN: 
             default: 
                 throw new IllegalArgumentException(type.toCamelCase()+" not 
supported");
@@ -116,6 +127,7 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
     private final Map<String, String> enricherIdToType;
     private final Map<String, String> feedIdToType;
     private Map<String, CatalogItemMemento> catalogItems;
+    private Map<String, ManagedBundleMemento> bundles; 
     
     private BrooklynMementoManifestImpl(Builder builder) {
         planeId = builder.planeId;
@@ -125,6 +137,7 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
         enricherIdToType = builder.enricherIdToType;
         feedIdToType = builder.feedIdToType;
         catalogItems = builder.catalogItems;
+        bundles = builder.bundles;
     }
 
     @Override
@@ -171,6 +184,21 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
     public Map<String, CatalogItemMemento> getCatalogItemMementos() {
         return Collections.unmodifiableMap(catalogItems);
     }
+    
+    @Override
+    public ManagedBundleMemento getBundle(String id) {
+        return bundles.get(id);
+    }
+
+    @Override
+    public Collection<String> getBundleIds() {
+        return Collections.unmodifiableSet(bundles.keySet());
+    }
+
+    @Override
+    public Map<String, ManagedBundleMemento> getBundles() {
+        return Collections.unmodifiableMap(bundles);
+    }
 
     @Override
     public boolean isEmpty() {
@@ -179,7 +207,8 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
                 policyIdToType.isEmpty() &&
                 enricherIdToType.isEmpty() &&
                 feedIdToType.isEmpty() &&
-                catalogItems.isEmpty();
+                catalogItems.isEmpty() &&
+                bundles.isEmpty();
     }
     
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
index da54080..fbf24b8 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java
@@ -38,6 +38,7 @@ import 
org.apache.brooklyn.api.mgmt.rebind.mementos.EnricherMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.FeedMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento;
+import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.Memento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.PolicyMemento;
 import org.apache.brooklyn.api.objs.BrooklynObject;
@@ -48,6 +49,7 @@ import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode;
 import org.apache.brooklyn.api.sensor.Enricher;
 import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.api.typereg.ManagedBundle;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemDo;
 import org.apache.brooklyn.core.enricher.AbstractEnricher;
@@ -111,6 +113,8 @@ public class MementosGenerators {
             return newFeedMemento((Feed)instance);
         } else if (instance instanceof CatalogItem) {
             return newCatalogItemMemento((CatalogItem<?,?>) instance);
+        } else if (instance instanceof ManagedBundle) {
+            return newManagedBundleMemento((ManagedBundle) instance);
         } else {
             throw new IllegalArgumentException("Unexpected brooklyn type: 
"+(instance == null ? "null" : instance.getClass())+" ("+instance+")");
         }
@@ -442,6 +446,15 @@ public class MementosGenerators {
         return builder.build();
     }
     
+    private static ManagedBundleMemento newManagedBundleMemento(ManagedBundle 
bundle) {
+        BasicManagedBundleMemento.Builder builder = 
BasicManagedBundleMemento.builder();
+        populateBrooklynObjectMementoBuilder(bundle, builder);
+        builder.url(bundle.getUrl())
+            .symbolicName(bundle.getSymbolicName())
+            .version(bundle.getVersion());
+        return builder.build();
+    }
+    
     private static void populateBrooklynObjectMementoBuilder(BrooklynObject 
instance, AbstractMemento.Builder<?> builder) {
         if (Proxy.isProxyClass(instance.getClass())) {
             throw new IllegalStateException("Attempt to create memento from 
proxy "+instance+" (would fail with wrong type)");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
index 74b8bb0..ce4a2bf 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
@@ -246,6 +246,7 @@ public class CompoundTransformer {
         Map<String, String> enrichers = 
MutableMap.copyOf(rawData.getEnrichers());
         Map<String, String> feeds = MutableMap.copyOf(rawData.getFeeds());
         Map<String, String> catalogItems = 
MutableMap.copyOf(rawData.getCatalogItems());
+        Map<String, String> bundles = MutableMap.copyOf(rawData.getBundles());
 
         // TODO @neykov asks whether transformers should be run in 
registration order,
         // rather than in type order.  TBD.  (would be an easy change.)
@@ -303,6 +304,14 @@ public class CompoundTransformer {
                 }
                 catalogItems.keySet().removeAll(itemsToDelete);
                 break;
+            case MANAGED_BUNDLE:
+                missing = Sets.difference(itemsToDelete, bundles.keySet());
+                if (missing.size() > 0) {
+                    LOG.warn("Unable to delete " + type + " 
id"+Strings.s(missing.size())+" ("+missing+"), "
+                            + "because not found in persisted state 
(continuing)");
+                }
+                bundles.keySet().removeAll(itemsToDelete);
+                break;
             case UNKNOWN:
                 break; // no-op
             default:
@@ -344,6 +353,11 @@ public class CompoundTransformer {
                             
entry.setValue(transformer.transform(entry.getValue()));
                         }
                         break;
+                    case MANAGED_BUNDLE:
+                        for (Map.Entry<String, String> entry : 
bundles.entrySet()) {
+                            
entry.setValue(transformer.transform(entry.getValue()));
+                        }
+                        break;
                     case UNKNOWN:
                         break; // no-op
                     default:
@@ -360,6 +374,7 @@ public class CompoundTransformer {
                 .enrichers(enrichers)
                 .feeds(feeds)
                 .catalogItems(catalogItems)
+                .bundles(bundles)
                 .build();
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
index f7df463..0c2c87b 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java
@@ -32,6 +32,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry;
 import org.apache.brooklyn.api.typereg.RegisteredType;
 import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan;
 import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
+import org.apache.brooklyn.api.typereg.ManagedBundle;
 import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
 import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder;
 import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
@@ -48,6 +49,7 @@ import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
 public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry {
@@ -55,6 +57,7 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
     private static final Logger log = 
LoggerFactory.getLogger(BasicBrooklynTypeRegistry.class);
     
     private ManagementContext mgmt;
+    private Map<String,ManagedBundle> uploadedBundles = MutableMap.of();
     private Map<String,RegisteredType> localRegisteredTypes = MutableMap.of();
 
     public BasicBrooklynTypeRegistry(ManagementContext mgmt) {
@@ -321,4 +324,5 @@ public class BasicBrooklynTypeRegistry implements 
BrooklynTypeRegistry {
             throw new IllegalStateException("Cannot add "+type+" to catalog; 
different "+oldType+" is already present");
         }
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
new file mode 100644
index 0000000..4223e79
--- /dev/null
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.typereg;
+
+import java.util.Map;
+
+import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
+import org.apache.brooklyn.api.typereg.ManagedBundle;
+import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.objs.AbstractBrooklynObject;
+import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+
+public class BasicManagedBundle extends AbstractBrooklynObject implements 
ManagedBundle, BrooklynObjectInternal {
+
+    private String symbolicName;
+    private String version;
+    private String url;
+
+    // for deserializing (not sure if needed?)
+    @SuppressWarnings("unused")
+    private BasicManagedBundle() {}
+
+    public BasicManagedBundle(String name, String version, String url) {
+        if (name == null && version == null) {
+            Preconditions.checkNotNull(url, "Either a URL or both name and 
version are required");
+        } else {
+            Preconditions.checkNotNull(name, "Either a URL or both name and 
version are required");
+            Preconditions.checkNotNull(version, "Either a URL or both name and 
version are required");
+        }
+
+        this.symbolicName = name;
+        this.version = version;
+        this.url = url;
+    }
+    
+    @Override
+    public boolean isNameResolved() {
+        return symbolicName != null && version != null;
+    }
+    
+    @Override
+    public String getSymbolicName() {
+        return symbolicName;
+    }
+
+    @Override
+    public String getVersion() {
+        return version;
+    }
+
+    @Override
+    public String getUrl() {
+        return url;
+    }
+
+    @Override
+    public String getOsgiUniqueUrl() {
+        return "brooklyn:"+getId();
+    }
+    
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("symbolicName", symbolicName)
+                .add("version", version)
+                .add("url", url)
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(symbolicName, version, url);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null) return false;
+        if (getClass() != obj.getClass()) return false;
+        OsgiBundleWithUrl other = (OsgiBundleWithUrl) obj;
+        if (!Objects.equal(symbolicName, other.getSymbolicName())) return 
false;
+        if (!Objects.equal(version, other.getVersion())) return false;
+        if (!Objects.equal(url, other.getUrl())) return false;
+        return true;
+    }
+
+    // ---
+    
+    @Override
+    public String getDisplayName() {
+        return null;
+    }
+
+    @Override
+    public <T> T setConfig(ConfigKey<T> key, T val) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public <T> T getConfig(ConfigKey<T> key) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public RebindSupport<?> getRebindSupport() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ConfigurationSupportInternal config() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SubscriptionSupportInternal subscriptions() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setDisplayName(String newName) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected BrooklynObjectInternal configure(Map<?, ?> flags) {
+        throw new UnsupportedOperationException();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
index 1c8cc40..5db9820 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.core.typereg;
 import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle;
 import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
@@ -35,16 +36,20 @@ public class BasicOsgiBundleWithUrl implements 
CatalogBundle, OsgiBundleWithUrl
 
     public BasicOsgiBundleWithUrl(String name, String version, String url) {
         if (name == null && version == null) {
-            Preconditions.checkNotNull(url, "url to an OSGi bundle is 
required");
+            Preconditions.checkNotNull(url, "Either a URL or both name and 
version are required");
         } else {
-            Preconditions.checkNotNull(name, "both name and version are 
required");
-            Preconditions.checkNotNull(version, "both name and version are 
required");
+            Preconditions.checkNotNull(name, "Either a URL or both name and 
version are required");
+            Preconditions.checkNotNull(version, "Either a URL or both name and 
version are required");
         }
 
         this.symbolicName = name;
         this.version = version;
         this.url = url;
     }
+    
+    public BasicOsgiBundleWithUrl(OsgiBundleWithUrl b) {
+        this(b.getSymbolicName(), b.getVersion(), b.getUrl());
+    }
 
     @Override
     public boolean isNameResolved() {
@@ -74,7 +79,7 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, 
OsgiBundleWithUrl
 
     @Override
     public String toString() {
-        return Objects.toStringHelper(this)
+        return MoreObjects.toStringHelper(this)
                 .add("symbolicName", symbolicName)
                 .add("version", version)
                 .add("url", url)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
index 29ea68b..4e18336 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
@@ -537,7 +537,7 @@ public class RebindTestUtils {
             BrooklynMementoRawData data = 
persister.loadMementoRawData(RebindExceptionHandlerImpl.builder().build());
             List<BrooklynObjectType> types = 
ImmutableList.of(BrooklynObjectType.ENTITY, BrooklynObjectType.LOCATION, 
                     BrooklynObjectType.POLICY, BrooklynObjectType.ENRICHER, 
BrooklynObjectType.FEED, 
-                    BrooklynObjectType.CATALOG_ITEM);
+                    BrooklynObjectType.CATALOG_ITEM, 
BrooklynObjectType.MANAGED_BUNDLE);
             for (BrooklynObjectType type : types) {
                 LOG.info(type+" ("+data.getObjectsOfType(type).keySet()+"):");
                 for (Map.Entry<String, String> entry : 
data.getObjectsOfType(type).entrySet()) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java
index b94970d..e012ac4 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java
@@ -69,7 +69,7 @@ public class RecordingRebindExceptionHandler extends 
RebindExceptionHandlerImpl
 
     @Override
     public void onCreateFailed(BrooklynObjectType type, String id, String 
instanceType, Exception e) {
-        createFailures.put(id, new IllegalStateException("problem creating 
location "+id+" of type "+instanceType, e));
+        createFailures.put(id, new IllegalStateException("problem creating 
"+type+" "+id+" of type "+instanceType, e));
         super.onCreateFailed(type, id, instanceType, e);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
----------------------------------------------------------------------
diff --git 
a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
 
b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
index b64f291..9cac744 100644
--- 
a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
+++ 
b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
@@ -55,6 +55,7 @@ public abstract class AbstractCleanOrphanedStateTest extends 
RebindTestFixtureWi
                     .planeId(input.getPlaneId())
                     .brooklynVersion(input.getBrooklynVersion())
                     .catalogItems(input.getCatalogItems())
+                    .bundles(input.getBundles())
                     .entities(MutableMap.<String, 
String>builder().putAll(input.getEntities()).removeAll(deletions.entities).build())
                     .locations(MutableMap.<String, 
String>builder().putAll(input.getLocations()).removeAll(deletions.locations).build())
                     .feeds(MutableMap.<String, 
String>builder().putAll(input.getFeeds()).removeAll(deletions.feeds).build())

Reply via email to