Repository: brooklyn-server Updated Branches: refs/heads/master 7b5d367b8 -> b629f1b98
BROOKLYN-410: rebind locations from bundles Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/c964e36b Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/c964e36b Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/c964e36b Branch: refs/heads/master Commit: c964e36b82652e61220ad41d367dd09762b88c7d Parents: 923abe7 Author: Aled Sage <aled.s...@gmail.com> Authored: Wed Dec 14 15:33:04 2016 +0000 Committer: Aled Sage <aled.s...@gmail.com> Committed: Tue Dec 20 11:34:14 2016 +0000 ---------------------------------------------------------------------- .../CatalogOsgiVersionMoreEntityRebindTest.java | 43 ++++++++++++++++++++ .../core/mgmt/rebind/RebindIteration.java | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c964e36b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java index 5c131f5..b4af697 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityRebindTest.java @@ -21,18 +21,24 @@ package org.apache.brooklyn.camp.brooklyn.catalog; import static org.testng.Assert.assertEquals; import org.apache.brooklyn.api.entity.Entity; +import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.camp.brooklyn.AbstractYamlRebindTest; +import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.entity.StartableApplication; import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.entity.stock.BasicApplication; import org.apache.brooklyn.test.support.TestResourceUnavailableException; +import org.apache.brooklyn.util.core.ClassLoaderUtils; +import org.apache.brooklyn.util.javalang.Reflections; import org.apache.brooklyn.util.osgi.OsgiTestResources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; /** Many of the same tests as per {@link OsgiVersionMoreEntityTest} but using YAML for catalog and entities, so catalog item ID is set automatically */ @@ -85,4 +91,41 @@ public class CatalogOsgiVersionMoreEntityRebindTest extends AbstractYamlRebindTe Policy newPolicy = Iterables.getOnlyElement(newEntity.policies()); assertEquals(newPolicy.getPolicyType().getName(), policyType); } + + // See https://issues.apache.org/jira/browse/BROOKLYN-410 + @Test + @SuppressWarnings("unchecked") + public void testRebindsLocationFromBundle() throws Exception { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_PATH); + + String locationType = OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_LOCATION; + String locationTypeWithBundlePrefix = OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_SYMBOLIC_NAME_FULL + ":" + locationType; + + addCatalogItems( + "brooklyn.catalog:", + " id: with-library", + " version: 1.0", + " brooklyn.libraries:", + " - classpath:" + OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_COM_EXAMPLE_PATH, + " item:", + " services:", + " - type: " + BasicApplication.class.getName(), + " brooklyn.children:", + " - type: " + TestEntity.class.getName()); + + Entity app = createAndStartApplication("services: [ { type: 'with-library:1.0' } ]"); + Entity entity = Iterables.getOnlyElement(app.getChildren()); + + // Add a location that can only be classloaded from the `brooklyn.libraries` bundle + Reflections reflections = new Reflections(CatalogOsgiVersionMoreEntityRebindTest.class.getClassLoader()); + Class<? extends Location> locationClazz = (Class<? extends Location>) new ClassLoaderUtils(reflections.getClassLoader(), mgmt()).loadClass(locationTypeWithBundlePrefix); + Location loc = mgmt().getLocationManager().createLocation(LocationSpec.create(locationClazz)); + ((EntityInternal)entity).addLocations(ImmutableList.of(loc)); + + // Confirm that we can rebind, and thus instantiate that location + StartableApplication newApp = rebind(); + Entity newEntity = Iterables.getOnlyElement(newApp.getChildren()); + Location newLoc = Iterables.getOnlyElement(newEntity.getLocations()); + assertEquals(newLoc.getClass().getName(), locationType); + } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c964e36b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java index 4aee9a8..2164814 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java @@ -988,7 +988,7 @@ public abstract class RebindIteration { } catch (Exception e) { Exceptions.propagateIfFatal(e); } - return new ClassLoaderUtils(reflections.getClassLoader()).loadClass(jType); + return new ClassLoaderUtils(reflections.getClassLoader(), managementContext).loadClass(jType); } @SuppressWarnings("unchecked")