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 <[email protected]>
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();
}