Repository: brooklyn-server Updated Branches: refs/heads/master 34c28995e -> d5462fbbf
Use entity's classpath when loading resources In addition to any libraries provided by the catalog item Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/c8129867 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/c8129867 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/c8129867 Branch: refs/heads/master Commit: c8129867eb174e632c3c616c1462a14a323d812d Parents: 10613d1 Author: Svetoslav Neykov <[email protected]> Authored: Fri Jul 8 15:50:06 2016 +0300 Committer: Svetoslav Neykov <[email protected]> Committed: Tue Jul 12 13:01:51 2016 +0300 ---------------------------------------------------------------------- .../brooklyn/catalog/CatalogYamlEntityTest.java | 71 ++++++++++++++++++++ .../internal/AbstractManagementContext.java | 7 +- 2 files changed, 77 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c8129867/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java index 60eed64..ea62643 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java @@ -32,6 +32,7 @@ import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; +import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest; @@ -892,6 +893,76 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { deleteCatalogEntity(symbolicName); } + @Test + public void testIndirectCatalogItemCanLoadResources() throws Exception { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_PATH); + + String symbolicNameInner = "my.catalog.app.id.inner"; + String symbolicNameOuter = "my.catalog.app.id.outer"; + addCatalogItems( + "brooklyn.catalog:", + " version: " + TEST_VERSION, + " items:", + " - id: " + symbolicNameInner, + " name: My Catalog App", + " description: My description", + " icon_url: classpath://path/to/myicon.jpg", + " libraries:", + " - url: " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL, + " item: " + SIMPLE_ENTITY_TYPE, + " - id: " + symbolicNameOuter, + " item: " + symbolicNameInner); + + String yaml = "name: " + symbolicNameOuter + "\n" + + "services: \n" + + " - serviceType: "+ver(symbolicNameOuter); + Entity app = createAndStartApplication(yaml); + Entity entity = app.getChildren().iterator().next(); + + ResourceUtils.create(entity).getResourceAsString("classpath://yaml-ref-osgi-entity.yaml"); + + deleteCatalogEntity(symbolicNameInner); + deleteCatalogEntity(symbolicNameOuter); + } + + // The test is disabled as it fails. The entity will get assigned the outer-most catalog + // item which doesn't have the necessary libraries with visibility to the entity's classpath + // When loading resources from inside the entity then we will use the wrong BCLCS. A workaround + // has been implemented which explicitly adds the entity's class loader to the fallbacks. + @Test(groups="WIP") + public void testCatalogItemIdInReferencedItems() throws Exception { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_PATH); + + String symbolicNameInner = "my.catalog.app.id.inner"; + String symbolicNameOuter = "my.catalog.app.id.outer"; + addCatalogItems( + "brooklyn.catalog:", + " version: " + TEST_VERSION, + " items:", + " - id: " + symbolicNameInner, + " name: My Catalog App", + " description: My description", + " icon_url: classpath://path/to/myicon.jpg", + " libraries:", + " - url: " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL, + " item: " + SIMPLE_ENTITY_TYPE, + " - id: " + symbolicNameOuter, + " item: " + symbolicNameInner); + + String yaml = "name: " + symbolicNameOuter + "\n" + + "services: \n" + + " - serviceType: "+ver(symbolicNameOuter); + + Entity app = createAndStartApplication(yaml); + Entity entity = app.getChildren().iterator().next(); + + // Fails + assertEquals(entity.getCatalogItemId(), ver(symbolicNameInner)); + + deleteCatalogEntity(symbolicNameInner); + deleteCatalogEntity(symbolicNameOuter); + } + private void registerAndLaunchAndAssertSimpleEntity(String symbolicName, String serviceType) throws Exception { addCatalogOSGiEntity(symbolicName, serviceType); String yaml = "name: simple-app-yaml\n" + http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c8129867/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java index 67bcd11..ea84f3c 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/AbstractManagementContext.java @@ -66,6 +66,7 @@ import org.apache.brooklyn.core.internal.storage.impl.BrooklynStorageImpl; import org.apache.brooklyn.core.internal.storage.impl.inmemory.InMemoryDataGridFactory; import org.apache.brooklyn.core.location.BasicLocationRegistry; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; +import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContextSequential; import org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContext; import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; import org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl; @@ -131,7 +132,11 @@ public abstract class AbstractManagementContext implements ManagementContextInte RegisteredType item = internal.getManagementContext().getTypeRegistry().get(internal.getCatalogItemId()); if (item != null) { - return CatalogUtils.newClassLoadingContext(internal.getManagementContext(), item); + BrooklynClassLoadingContext itemLoader = CatalogUtils.newClassLoadingContext(internal.getManagementContext(), item); + // Falls back to the entity's class loader + JavaBrooklynClassLoadingContext entityLoader = JavaBrooklynClassLoadingContext.create(input.getClass().getClassLoader()); + BrooklynClassLoadingContext seqLoader = new BrooklynClassLoadingContextSequential(internal.getManagementContext(), itemLoader, entityLoader); + return seqLoader; } else { log.error("Can't find catalog item " + internal.getCatalogItemId() + " used for instantiating entity " + internal +
