restore test bundle counts, and resolve library URLs on install
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/21e93d27 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/21e93d27 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/21e93d27 Branch: refs/heads/master Commit: 21e93d27bed7efd3d8f115c8fc2234b39360ee3a Parents: 480a0c7 Author: Alex Heneveld <[email protected]> Authored: Wed Jun 28 11:28:24 2017 +0100 Committer: Alex Heneveld <[email protected]> Committed: Wed Jun 28 11:28:24 2017 +0100 ---------------------------------------------------------------------- .../CatalogOsgiVersionMoreEntityTest.java | 19 ++++++++--- .../catalog/internal/BasicBrooklynCatalog.java | 35 ++++++++++++++------ .../core/catalog/internal/CatalogBundleDto.java | 13 ++++++++ .../apache/brooklyn/util/core/osgi/Osgis.java | 1 + 4 files changed, 52 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/21e93d27/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java ---------------------------------------------------------------------- diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java index 6fee53e..10f2454 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogOsgiVersionMoreEntityTest.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.camp.brooklyn.catalog; import static org.testng.Assert.assertTrue; +import java.util.List; import java.util.Map; import org.apache.brooklyn.api.entity.Entity; @@ -30,10 +31,10 @@ import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.api.policy.PolicySpec; import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; import org.apache.brooklyn.api.typereg.ManagedBundle; +import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest; import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynEntityMatcher; -import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest; @@ -42,6 +43,7 @@ import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; import org.apache.brooklyn.core.typereg.RegisteredTypes; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.test.support.TestResourceUnavailableException; +import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.core.ResourceUtils; import org.apache.brooklyn.util.osgi.OsgiTestResources; import org.apache.brooklyn.util.text.Strings; @@ -75,7 +77,7 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest implement // bundle installed Map<String, ManagedBundle> bundles = ((ManagementContextInternal)mgmt()).getOsgiManager().get().getManagedBundles(); - Asserts.assertSize(bundles.keySet(), 1 + (BasicBrooklynCatalog.AUTO_WRAP_CATALOG_YAML_AS_BUNDLE ? 1 : 0)); + Asserts.assertSize(bundles.keySet(), 1); Assert.assertTrue(bundles.keySet().contains( br.getMetadata().getId() )); // types installed @@ -96,7 +98,7 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest implement Assert.assertNotNull(item); Assert.assertEquals(item.getVersion(), "1.0"); Assert.assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item)); - Assert.assertEquals(item.getLibraries().size(), 1 + (BasicBrooklynCatalog.AUTO_WRAP_CATALOG_YAML_AS_BUNDLE ? 1 : 0)); + Assert.assertEquals(item.getLibraries().size(), 1); Entity app = createAndStartApplication("services: [ { type: 'more-entity:1.0' } ]"); Entity moreEntity = Iterables.getOnlyElement(app.getChildren()); @@ -220,7 +222,7 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest implement // this refers to the java item, where the libraries are defined item = mgmt().getTypeRegistry().get("org.apache.brooklyn.test.osgi.entities.more.MoreEntity"); Assert.assertEquals(item.getVersion(), "2.0.test_java"); - Assert.assertEquals(item.getLibraries().size(), 2 + (BasicBrooklynCatalog.AUTO_WRAP_CATALOG_YAML_AS_BUNDLE ? 1 : 0)); + Assert.assertEquals(item.getLibraries().size(), 2); Entity app = createAndStartApplication("services: [ { type: 'more-entity:2.0.test' } ]"); Entity moreEntity = Iterables.getOnlyElement(app.getChildren()); @@ -247,7 +249,14 @@ public class CatalogOsgiVersionMoreEntityTest extends AbstractYamlTest implement // this refers to the java item, where the libraries are defined item = mgmt().getTypeRegistry().get("org.apache.brooklyn.test.osgi.entities.more.MorePolicy"); Assert.assertEquals(item.getVersion(), "2.0.test_java"); - Assert.assertEquals(item.getLibraries().size(), 2 + (BasicBrooklynCatalog.AUTO_WRAP_CATALOG_YAML_AS_BUNDLE ? 1 : 0)); + // check the libraries are as expected and fully resolved + List<String> libStr = MutableList.of(); + for (OsgiBundleWithUrl ob: item.getLibraries()) { + libStr.add(ob.getVersionedName()==null ? ob.getUrl() : ob.getVersionedName().toString()); + } + Assert.assertEquals(libStr, MutableList.of( + BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FULL+":"+"0.2.0", + BROOKLYN_TEST_OSGI_ENTITIES_SYMBOLIC_NAME_FULL+":"+"0.1.0")); Entity app = createAndStartApplication( "services: ", http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/21e93d27/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java index dacdb90..116113d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java @@ -67,6 +67,7 @@ import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.core.ResourceUtils; import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.core.osgi.BundleMaker; +import org.apache.brooklyn.util.core.osgi.Osgis; import org.apache.brooklyn.util.core.task.Tasks; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.exceptions.UserFacingException; @@ -546,7 +547,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { Collection<CatalogBundle> librariesAddedHereBundles = CatalogItemDtoAbstract.parseLibraries(librariesAddedHereNames); MutableSet<Object> librariesCombinedNames = MutableSet.of(); - if (!isNoBundleOrSimpleWrappingBundle(containingBundle)) { + if (!isNoBundleOrSimpleWrappingBundle(mgmt, containingBundle)) { // ensure containing bundle is declared, first, for search purposes librariesCombinedNames.add(containingBundle.getVersionedName().toOsgiString()); } @@ -561,12 +562,16 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { // but this load is required for resolving YAML in this BOM (and if java-scanning); // need to think through how we expect dependencies to be installed CatalogUtils.installLibraries(mgmt, librariesAddedHereBundles); + + // use resolved bundles + librariesAddedHereBundles = resolveWherePossible(mgmt, librariesAddedHereBundles); + libraryBundles = resolveWherePossible(mgmt, libraryBundles); Boolean scanJavaAnnotations = getFirstAs(itemMetadataWithoutItemDef, Boolean.class, "scanJavaAnnotations", "scan_java_annotations").orNull(); if (scanJavaAnnotations==null || !scanJavaAnnotations) { // don't scan } else { - if (isNoBundleOrSimpleWrappingBundle(containingBundle)) { + if (isNoBundleOrSimpleWrappingBundle(mgmt, containingBundle)) { // BOMs wrapped in JARs, or without JARs, have special treatment if (isLibrariesMoreThanJustContainingBundle(librariesAddedHereBundles, containingBundle)) { // legacy mode, since 0.12.0, scan libraries referenced in a legacy non-bundle BOM @@ -800,7 +805,15 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { result.add(dto); } - private boolean isLibrariesMoreThanJustContainingBundle(Collection<CatalogBundle> library, ManagedBundle containingBundle) { + protected static Collection<CatalogBundle> resolveWherePossible(ManagementContext mgmt, Collection<CatalogBundle> libraryBundles) { + Collection<CatalogBundle> libraryBundlesResolved = MutableSet.of(); + for (CatalogBundle b: libraryBundles) { + libraryBundlesResolved.add(CatalogBundleDto.resolve(mgmt, b).or(b)); + } + return libraryBundlesResolved; + } + + private static boolean isLibrariesMoreThanJustContainingBundle(Collection<CatalogBundle> library, ManagedBundle containingBundle) { if (library==null) return false; if (containingBundle==null) return !library.isEmpty(); if (library.size()>1) return true; @@ -808,7 +821,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { return !containingBundle.getVersionedName().equalsOsgi(li.getVersionedName()); } - private boolean isNoBundleOrSimpleWrappingBundle(ManagedBundle b) { + private static boolean isNoBundleOrSimpleWrappingBundle(ManagementContext mgmt, ManagedBundle b) { if (b==null) return true; String wrapped = ((ManagementContextInternal)mgmt).getOsgiManager().get().findBundle(b).get().getHeaders().get(BROOKLYN_WRAPPED_BOM_BUNDLE); return wrapped!=null && wrapped.equalsIgnoreCase("true"); @@ -915,7 +928,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { @SuppressWarnings({ "unchecked", "rawtypes" }) Collection<CatalogItemDtoAbstract<?, ?>> result = (Collection)Collections2.transform( (Collection<CatalogItemDo<Object,Object>>)(Collection)subCatalog.getIdCache().values(), - itemDoToDtoAddingSelectedMetadataDuringScan(catalogMetadata, containingBundle)); + itemDoToDtoAddingSelectedMetadataDuringScan(mgmt, catalogMetadata, containingBundle)); return result; } @@ -1397,7 +1410,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { }; } - private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final Map<?, ?> catalogMetadata, ManagedBundle containingBundle) { + private static <T,SpecT> Function<CatalogItemDo<T, SpecT>, CatalogItem<T,SpecT>> itemDoToDtoAddingSelectedMetadataDuringScan(final ManagementContext mgmt, final Map<?, ?> catalogMetadata, ManagedBundle containingBundle) { return new Function<CatalogItemDo<T,SpecT>, CatalogItem<T,SpecT>>() { @Override public CatalogItem<T,SpecT> apply(@Nullable CatalogItemDo<T,SpecT> item) { @@ -1412,21 +1425,21 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { if (Strings.isNonBlank(version)) dto.setVersion(version); Collection<CatalogBundle> libraryBundles = MutableSet.of(); - if (containingBundle!=null) { + if (!isNoBundleOrSimpleWrappingBundle(mgmt, containingBundle)) { libraryBundles.add(new CatalogBundleDto(containingBundle.getSymbolicName(), containingBundle.getSuppliedVersionString(), null)); } libraryBundles.addAll(dto.getLibraries()); Object librariesInherited; librariesInherited = catalogMetadata.get("brooklyn.libraries"); if (librariesInherited instanceof Collection) { - // will be set by scan -- slightly longwinded way to retrieve, but scanning for osgi needs an overhaul in any case - libraryBundles.addAll(CatalogItemDtoAbstract.parseLibraries((Collection<?>) librariesInherited)); + // will be set by scan -- slightly longwinded way to retrieve, but scanning java should be deprecated I think (AH) + libraryBundles.addAll(resolveWherePossible(mgmt, CatalogItemDtoAbstract.parseLibraries((Collection<?>) librariesInherited))); } librariesInherited = catalogMetadata.get("libraries"); if (librariesInherited instanceof Collection) { log.warn("Legacy 'libraries' encountered; use 'brooklyn.libraries'"); // will be set by scan -- slightly longwinded way to retrieve, but scanning for osgi needs an overhaul in any case - libraryBundles.addAll(CatalogItemDtoAbstract.parseLibraries((Collection<?>) librariesInherited)); + libraryBundles.addAll(resolveWherePossible(mgmt, CatalogItemDtoAbstract.parseLibraries((Collection<?>) librariesInherited))); } dto.setLibraries(libraryBundles); @@ -1488,7 +1501,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { Maybe<OsgiManager> osgi = ((ManagementContextInternal)mgmt).getOsgiManager(); if (osgi.isAbsent()) return; for (ManagedBundle b: osgi.get().getManagedBundles().values()) { - if (isNoBundleOrSimpleWrappingBundle(b)) { + if (isNoBundleOrSimpleWrappingBundle(mgmt, b)) { Iterable<RegisteredType> typesInBundle = osgi.get().getTypesFromBundle(b.getVersionedName()); if (Iterables.isEmpty(typesInBundle)) { log.debug("uninstalling empty wrapper bundle "+b); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/21e93d27/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java index 2006d5b..1653fcc 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleDto.java @@ -23,8 +23,13 @@ import com.google.common.base.Objects; import com.google.common.base.Preconditions; import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle; +import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.core.mgmt.ha.OsgiManager; +import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; +import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.osgi.VersionedName; import org.apache.brooklyn.util.text.BrooklynVersionSyntax; +import org.osgi.framework.Bundle; public class CatalogBundleDto implements CatalogBundle { private String symbolicName; @@ -106,5 +111,13 @@ public class CatalogBundleDto implements CatalogBundle { return true; } + public static Maybe<CatalogBundle> resolve(ManagementContext mgmt, CatalogBundle b) { + if (b.isNameResolved()) return Maybe.of(b); + OsgiManager osgi = ((ManagementContextInternal)mgmt).getOsgiManager().orNull(); + if (osgi==null) return Maybe.absent("No OSGi manager"); + Maybe<Bundle> b2 = osgi.findBundle(b); + if (b2.isAbsent()) return Maybe.absent("Nothing installed for "+b); + return Maybe.of(new CatalogBundleDto(b2.get().getSymbolicName(), b2.get().getVersion().toString(), b.getUrl())); + } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/21e93d27/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java index c1a40f8..235f9dd 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/osgi/Osgis.java @@ -428,4 +428,5 @@ public class Osgis { Bundle bundle = org.osgi.framework.FrameworkUtil.getBundle(clazz); return Optional.fromNullable(bundle); } + }
