This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
The following commit(s) were added to refs/heads/master by this push: new d0ce66d1cd support icons on bundles using bundleIconUrl d0ce66d1cd is described below commit d0ce66d1cda3c0c99b6d862b1b42bc6a2feafae7 Author: Alex Heneveld <g...@alex.heneveld.org> AuthorDate: Thu Jun 27 17:21:42 2024 +0100 support icons on bundles using bundleIconUrl previously worked from bom files only, now routine is shared with catalog.bom file in an archive; also sets tags, and searches in the bundle correctly to find the icon. --- .../mgmt/ha/BrooklynBomOsgiArchiveInstaller.java | 57 +++++++++++----------- .../mgmt/internal/AbstractManagementContext.java | 10 +++- .../BrooklynBomYamlCatalogBundleResolver.java | 26 ++++++---- .../brooklyn/rest/resources/BundleResource.java | 4 +- 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java index 011abd316b..e6b89ca141 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java @@ -389,38 +389,39 @@ public class BrooklynBomOsgiArchiveInstaller { private void discoverManifestFromCatalogBom(boolean isCatalogBomRequired) { discoveredManifest = new BundleMaker(mgmt()).getManifest(zipFile.getFile()); - if (Strings.isNonBlank(bomText)) { - discoveredBomVersionedName = BasicBrooklynCatalog.getVersionedName(BasicBrooklynCatalog.getCatalogMetadata(bomText), false ); - return; - } - - ZipFile zf = null; - try { + Map<?, ?> catalogMetadata = null; + if (Strings.isBlank(bomText)) { + ZipFile zf = null; try { - zf = new ZipFile(zipFile.getFile()); - } catch (IOException e) { - throw new IllegalArgumentException("Invalid ZIP/JAR archive: "+e); - } - ZipEntry bom = zf.getEntry(BasicBrooklynCatalog.CATALOG_BOM); - if (bom==null) { - bom = zf.getEntry("/"+BasicBrooklynCatalog.CATALOG_BOM); - } - if (bom==null) { - if (isCatalogBomRequired) { - throw new IllegalArgumentException("Archive must contain a catalog.bom file in the root"); - } else { - return; + try { + zf = new ZipFile(zipFile.getFile()); + } catch (IOException e) { + throw new IllegalArgumentException("Invalid ZIP/JAR archive: " + e); } + ZipEntry bom = zf.getEntry(BasicBrooklynCatalog.CATALOG_BOM); + if (bom == null) { + bom = zf.getEntry("/" + BasicBrooklynCatalog.CATALOG_BOM); + } + if (bom == null) { + if (isCatalogBomRequired) { + throw new IllegalArgumentException("Archive must contain a catalog.bom file in the root"); + } else { + return; + } + } + try { + bomText = Streams.readFullyString(zf.getInputStream(bom)); + } catch (IOException e) { + throw new IllegalArgumentException("Error reading catalog.bom from ZIP/JAR archive: " + e); + } + } finally { + Streams.closeQuietly(zf); } - try { - bomText = Streams.readFullyString(zf.getInputStream(bom)); - } catch (IOException e) { - throw new IllegalArgumentException("Error reading catalog.bom from ZIP/JAR archive: "+e); - } - discoveredBomVersionedName = BasicBrooklynCatalog.getVersionedName( BasicBrooklynCatalog.getCatalogMetadata(bomText), false ); - } finally { - Streams.closeQuietly(zf); } + + catalogMetadata = BasicBrooklynCatalog.getCatalogMetadata(bomText); + discoveredBomVersionedName = BasicBrooklynCatalog.getVersionedName(catalogMetadata, false ); + BrooklynBomYamlCatalogBundleResolver.setTagsAndIconUrl(catalogMetadata, inferredMetadata); } private void updateManifestFromAllSourceInformation() { 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 7d569dc146..8450b6e425 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 @@ -21,6 +21,7 @@ package org.apache.brooklyn.core.mgmt.internal; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Predicates; +import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import static org.apache.brooklyn.core.catalog.internal.CatalogUtils.newClassLoadingContextForCatalogItems; @@ -132,10 +133,15 @@ public abstract class AbstractManagementContext implements ManagementContextInte return seqLoader; } - return apply(internal.getManagementSupport()); + if (internal.getManagementSupport()==null) return null; + return apply(internal.getManagementSupport().getManagementContext()); } - + if (input instanceof EntityManagementSupport) { + // i think was only used by above, when there is no entity bundle; and now goes directly to mgmt context; + // but just in case let's continue to support this, and prefer the entity if available + if (((EntityManagementSupport) input).entity instanceof EntityInternal) + return apply(((EntityManagementSupport) input).entity); return apply(((EntityManagementSupport) input).getManagementContext()); } diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java index faa51f875c..fbdea2890f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java @@ -25,6 +25,8 @@ import java.util.function.Supplier; import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.zip.ZipEntry; + +import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.config.ConfigUtils; import org.apache.brooklyn.core.mgmt.BrooklynTags; @@ -131,15 +133,7 @@ public class BrooklynBomYamlCatalogBundleResolver extends AbstractCatalogBundleR BasicManagedBundle basicManagedBundle = new BasicManagedBundle(vn.getSymbolicName(), vn.getVersionString(), null, BrooklynBomBundleCatalogBundleResolver.FORMAT, null, null, options.getDeleteable(), options.getFromInitialCatalog()); - // if the submitted blueprint contains tags, we set them on the bundle, so they can be picked up and used to tag the plan. - if( cm.containsKey("tags") && cm.get("tags") instanceof Iterable) { - basicManagedBundle.tags().addTags((Iterable<?>)cm.get("tags")); - } - // Store the bundleIconUrl as an ICON_URL tag - Maybe<String> bundleIconUrl = ConfigUtils.getFirstAs(cm, String.class, "bundleIconUrl"); - if (bundleIconUrl.isPresentAndNonNull()) { - basicManagedBundle.tags().addTag(BrooklynTags.newIconUrlTag(bundleIconUrl.get())); - } + setTagsAndIconUrl(cm, basicManagedBundle); result = ((ManagementContextInternal)mgmt).getOsgiManager().get().installBrooklynBomBundle( basicManagedBundle, InputStreamSource.of("ZIP generated for "+vn+": "+bf, bf), options.isStart(), options.isLoadCatalogBom(), options.isForceUpdateOfNonSnapshots(), options.isValidateTypes(), options.isDeferredStart()).get(); @@ -153,4 +147,18 @@ public class BrooklynBomYamlCatalogBundleResolver extends AbstractCatalogBundleR ((BasicBrooklynCatalog)mgmt.getCatalog()).uninstallEmptyWrapperBundles(); return ReferenceWithError.newInstanceWithoutError(result); } + + public static void setTagsAndIconUrl(Map<?, ?> properties, ManagedBundle managedBundle) { + if (properties==null) return; + + // if the submitted blueprint contains tags, we set them on the bundle, so they can be picked up and used to tag the plan. + if( properties.containsKey("tags") && properties.get("tags") instanceof Iterable) { + managedBundle.tags().addTags((Iterable<?>) properties.get("tags")); + } + // Store the bundleIconUrl as an ICON_URL tag + Maybe<String> bundleIconUrl = ConfigUtils.getFirstAs(properties, String.class, "bundleIconUrl", "bundle_icon_url", "iconUrl", "icon_url"); + if (bundleIconUrl.isPresentAndNonNull()) { + managedBundle.tags().addTag(BrooklynTags.newIconUrlTag(bundleIconUrl.get())); + } + } } diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java index d9dea6693f..e2d7fcffd9 100644 --- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java @@ -36,6 +36,7 @@ import org.apache.brooklyn.api.objs.EntityAdjunct; import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.mgmt.BrooklynTags; +import org.apache.brooklyn.core.mgmt.classloading.OsgiBrooklynClassLoadingContext; import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; import org.apache.brooklyn.core.mgmt.ha.OsgiBundleInstallationResult; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; @@ -280,7 +281,8 @@ public class BundleResource extends AbstractBrooklynRestResource implements Bund // paths (ie non-protocol) and // NB, for security, file URL's are NOT served MediaType mime = WebResourceUtils.getImageMediaTypeFromExtension(Files.getFileExtension(url)); - Object content = ResourceUtils.create(b).getResourceFromUrl(url); + OsgiBrooklynClassLoadingContext cl = new OsgiBrooklynClassLoadingContext(mgmt(), null, MutableList.of(b)); + Object content = ResourceUtils.create(cl).getResourceFromUrl(url); return Response.ok(content, mime).build(); }