You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2017/09/26 12:17:09 UTC

[4/9] brooklyn-server git commit: fix bundle install issue if already osgi-installed, and tidy

fix bundle install issue if already osgi-installed, and tidy

take the URL from the existing osgi-installed bundle.
much better logging.


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/277cb22a
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/277cb22a
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/277cb22a

Branch: refs/heads/master
Commit: 277cb22aa6b8553bb5369dfd4d1d5eba2185a858
Parents: 87a2852
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Sep 21 11:35:25 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Sep 21 13:17:07 2017 +0100

----------------------------------------------------------------------
 .../core/catalog/internal/CatalogUtils.java     |  4 +-
 .../core/mgmt/ha/OsgiArchiveInstaller.java      | 97 +++++++++++++-------
 2 files changed, 67 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/277cb22a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
index 973f56d..471ce64 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java
@@ -215,8 +215,8 @@ public class CatalogUtils {
             }
             if (log.isDebugEnabled()) { 
                 logDebugOrTraceIfRebinding(log, 
-                    "Registered {} bundles in {}",
-                    new Object[]{libraries.size(), Time.makeTimeStringRounded(timer)});
+                    "Registered {} bundle{} in {}",
+                    new Object[]{libraries.size(), Strings.s(libraries.size()), Time.makeTimeStringRounded(timer)});
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/277cb22a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
index 15430e5..f00b96f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
@@ -129,52 +129,85 @@ class OsgiArchiveInstaller {
     }
     
     private synchronized void makeLocalZipFileFromInputStreamOrUrl() {
+        Maybe<Bundle> existingOsgiInstalledBundle = Maybe.absent();
+        Maybe<ManagedBundle> existingBrooklynInstalledBundle = Maybe.absent();
         if (zipIn==null) {
-            Maybe<Bundle> installedBundle = Maybe.absent();
             if (suppliedKnownBundleMetadata!=null) {
-                // if no input stream, look for a URL and/or a matching bundle
+                // if no input stream (zipIn), look for a URL and/or a matching bundle
                 if (!suppliedKnownBundleMetadata.isNameResolved()) {
-                    ManagedBundle mbFromUrl = osgiManager.getManagedBundleFromUrl(suppliedKnownBundleMetadata.getUrl());
-                    if (mbFromUrl!=null) {
+                    existingBrooklynInstalledBundle = Maybe.ofDisallowingNull(osgiManager.getManagedBundleFromUrl(suppliedKnownBundleMetadata.getUrl()));
+                    if (existingBrooklynInstalledBundle.isPresent()) {
                         // user supplied just a URL (eg brooklyn.libraries), but we recognise it,
                         // so don't try to reload it, just record the info we know about it to retrieve the bundle
-                        ((BasicManagedBundle)suppliedKnownBundleMetadata).setSymbolicName(mbFromUrl.getSymbolicName());
-                        ((BasicManagedBundle)suppliedKnownBundleMetadata).setVersion(mbFromUrl.getSuppliedVersionString());
+                        ((BasicManagedBundle)suppliedKnownBundleMetadata).setSymbolicName(existingBrooklynInstalledBundle.get().getSymbolicName());
+                        ((BasicManagedBundle)suppliedKnownBundleMetadata).setVersion(existingBrooklynInstalledBundle.get().getSuppliedVersionString());
                     }
                 }
-                if (installedBundle.isAbsent() && suppliedKnownBundleMetadata.getOsgiUniqueUrl()!=null) {
-                    installedBundle = Osgis.bundleFinder(osgiManager.framework).requiringFromUrl(suppliedKnownBundleMetadata.getOsgiUniqueUrl()).find();
+                if (existingOsgiInstalledBundle.isAbsent() && suppliedKnownBundleMetadata.getOsgiUniqueUrl()!=null) {
+                    existingOsgiInstalledBundle = Osgis.bundleFinder(osgiManager.framework).requiringFromUrl(suppliedKnownBundleMetadata.getOsgiUniqueUrl()).find();
                 }
-                if (installedBundle.isAbsent() && suppliedKnownBundleMetadata.getUrl()!=null) {
-                    installedBundle = Osgis.bundleFinder(osgiManager.framework).requiringFromUrl(suppliedKnownBundleMetadata.getUrl()).find();
+                if (existingOsgiInstalledBundle.isAbsent() && suppliedKnownBundleMetadata.getUrl()!=null) {
+                    existingOsgiInstalledBundle = Osgis.bundleFinder(osgiManager.framework).requiringFromUrl(suppliedKnownBundleMetadata.getUrl()).find();
                 }
-                if (installedBundle.isAbsent() && suppliedKnownBundleMetadata.isNameResolved()) {
-                    installedBundle = Osgis.bundleFinder(osgiManager.framework).symbolicName(suppliedKnownBundleMetadata.getSymbolicName()).version(suppliedKnownBundleMetadata.getSuppliedVersionString()).find();
+                if (existingOsgiInstalledBundle.isAbsent() && suppliedKnownBundleMetadata.isNameResolved()) {
+                    existingOsgiInstalledBundle = Osgis.bundleFinder(osgiManager.framework).symbolicName(suppliedKnownBundleMetadata.getSymbolicName()).version(suppliedKnownBundleMetadata.getSuppliedVersionString()).find();
                 }
-                if (suppliedKnownBundleMetadata.getUrl()!=null) {
-                    if (installedBundle.isAbsent() || force) {
-                        // reload 
-                        zipIn = ResourceUtils.create(mgmt()).getResourceFromUrl(suppliedKnownBundleMetadata.getUrl());
+                if (existingOsgiInstalledBundle.isPresent()) {
+                    if (existingBrooklynInstalledBundle.isAbsent()) {
+                        // try to find as brooklyn bundle based on knowledge of OSGi bundle
+                        existingBrooklynInstalledBundle = Maybe.ofDisallowingNull(osgiManager.getManagedBundle(new VersionedName(existingOsgiInstalledBundle.get())));
                     }
-                }
-            }
-            
-            if (zipIn==null) {
-                if (installedBundle.isPresent()) {
-                    // no way to install (no url), or no need to install (not forced); just ignore it
-                    result.metadata = osgiManager.getManagedBundle(new VersionedName(installedBundle.get()));
-                    if (result.metadata==null) {
-                        // low-level installed bundle
-                        result.metadata = new BasicManagedBundle(installedBundle.get().getSymbolicName(), installedBundle.get().getVersion().toString(),
-                            suppliedKnownBundleMetadata!=null ? suppliedKnownBundleMetadata.getUrl() : null);
+                    if (suppliedKnownBundleMetadata.getUrl()==null) { 
+                        // installer did not supply a usable URL, just coords
+                        // but bundle is installed at least to OSGi
+                        if (existingBrooklynInstalledBundle.isPresent()) {
+                            log.debug("Detected bundle "+suppliedKnownBundleMetadata+" installed to Brooklyn already; no URL or stream supplied, so re-using existing installation");
+                            // if bundle is brooklyn-managed simply say "already installed"
+                            result.metadata = existingBrooklynInstalledBundle.get();
+                            result.setIgnoringAlreadyInstalled();
+                            return;
+                            
+                        } else {
+                            // if bundle is not brooklyn-managed we want to make it be so
+                            // and for that we need to find a URL.
+                            // some things declare usable locations, though these might be maven and 
+                            String candidateUrl = existingOsgiInstalledBundle.get().getLocation();
+                            log.debug("Detected bundle "+suppliedKnownBundleMetadata+" installed to OSGi but not Brooklyn; trying to find a URL to get bundle binary, candidate "+candidateUrl);
+                            if (Strings.isBlank(candidateUrl)) {
+                                throw new IllegalArgumentException("No input stream available and no URL could be found: no way to promote "+suppliedKnownBundleMetadata+" from "+existingOsgiInstalledBundle.get()+" to Brooklyn management");
+                            }
+                            try {
+                                // do this in special try block, not below, so we can give a better error
+                                // (the user won't understnad the URL)
+                                zipIn = ResourceUtils.create(mgmt()).getResourceFromUrl(candidateUrl);
+                            } catch (Exception e) {
+                                Exceptions.propagateIfFatal(e);
+                                throw new IllegalArgumentException("Could not find binary for already installed OSGi bundle "+existingOsgiInstalledBundle.get()+" (location "+candidateUrl+") when trying to promote "+suppliedKnownBundleMetadata+" to Brooklyn management", e);
+                            }
+                        }
                     }
+                } else if (suppliedKnownBundleMetadata.getUrl()==null) {
+                    // not installed anywhere and no URL
+                    throw new IllegalArgumentException("No input stream available and no URL could be found: no way to install "+suppliedKnownBundleMetadata);
+                }
+                
+                assert zipIn!=null || suppliedKnownBundleMetadata.getUrl()!=null : "should have found a stream or inferred a URL";
+                
+                if (zipIn!=null) {
+                    // found input stream for existing osgi bundle
+                } else if (existingBrooklynInstalledBundle.isAbsent() || force) {
+                    // reload 
+                    zipIn = ResourceUtils.create(mgmt()).getResourceFromUrl(suppliedKnownBundleMetadata.getUrl());
+                } else {
+                    // already installed, not forced, just say already installed
+                    // (even if snapshot as this is a reference by URL, not uploaded content) 
+                    result.metadata = existingBrooklynInstalledBundle.get();
                     result.setIgnoringAlreadyInstalled();
                     return;
                 }
-                result.metadata = suppliedKnownBundleMetadata;
-                throw new IllegalArgumentException("No input stream available and no URL could be found; nothing to install");
             }
-            result.bundle = installedBundle.orNull();
+            
+            result.bundle = existingOsgiInstalledBundle.orNull();
         }
         
         zipFile = Os.newTempFile("brooklyn-bundle-transient-"+suppliedKnownBundleMetadata, "zip");
@@ -372,7 +405,7 @@ class OsgiArchiveInstaller {
                 ((BasicManagedBundle)result.getMetadata()).setPersistenceNeeded(true);
                 mgmt().getRebindManager().getChangeListener().onChanged(result.getMetadata());
             }
-            log.debug(result.message + " (in osgi container)");
+            log.debug(result.message + " (partial): OSGi bundle installed, with bundle start and Brooklyn management to follow");
             // can now delete and close (copy has been made and is available from OsgiManager)
             zipFile.delete();
             zipFile = null;
@@ -511,7 +544,7 @@ class OsgiArchiveInstaller {
                         log.debug(result.message+", all items: "+result.typesInstalled);
                     }
                 } else {
-                    log.debug(result.message+" (into Brooklyn), with no catalog items");
+                    log.debug(result.message+" (complete): bundle started and now managed by Brooklyn, though no catalog items found (may have installed other bundles though)");
                 }
             }