You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ge...@apache.org on 2017/07/19 16:25:58 UTC

[28/39] brooklyn-server git commit: address two edge cases where osgi bundles out of sync with brooklyn-managed bundles

address two edge cases where osgi bundles out of sync with brooklyn-managed bundles

if in osgi but not in brooklyn, silently uninstall then reinstall. this happens on restart when persisting with karaf, or if user does `bundle:install`.

if not in osgi but is in brooklyn, warn then reinstall. this happens if user does `bundle:uninstall` in karaf.


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

Branch: refs/heads/master
Commit: bf7d292be0189591dbf274f1b238e258c1da7921
Parents: f344430
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jul 7 12:03:44 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Jul 7 12:03:44 2017 +0100

----------------------------------------------------------------------
 .../core/mgmt/ha/OsgiArchiveInstaller.java      | 22 +++++++++++++-------
 1 file changed, 14 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bf7d292b/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 1b06463..247bebd 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
@@ -306,9 +306,11 @@ class OsgiArchiveInstaller {
                 if (canUpdate()) { 
                     result.bundle = osgiManager.framework.getBundleContext().getBundle(result.getMetadata().getOsgiUniqueUrl());
                     if (result.getBundle()==null) {
-                        throw new IllegalStateException("Detected already managing bundle "+result.getMetadata().getVersionedName()+" but framework cannot find it");
+                        log.warn("Brooklyn thought is was already managing bundle "+result.getMetadata().getVersionedName()+" but it's not installed to framework; reinstalling it");
+                        updating = false;
+                    } else {
+                        updating = true;
                     }
-                    updating = true;
                 } else {
                     if (result.getMetadata().getChecksum()==null || inferredMetadata.getChecksum()==null) {
                         log.warn("Missing bundle checksum data for "+result+"; assuming bundle replacement is permitted");
@@ -324,11 +326,16 @@ class OsgiArchiveInstaller {
                 // no such managed bundle
                 Maybe<Bundle> b = Osgis.bundleFinder(osgiManager.framework).symbolicName(result.getMetadata().getSymbolicName()).version(result.getMetadata().getSuppliedVersionString()).find();
                 if (b.isPresent()) {
-                    // if it's non-brooklyn installed then fail
-                    // (e.g. someone trying to install brooklyn or guice through this mechanism!)
-                    result.bundle = b.get();
-                    result.code = OsgiBundleInstallationResult.ResultCode.ERROR_LAUNCHING_BUNDLE;
-                    throw new IllegalStateException("Bundle "+result.getMetadata().getVersionedName()+" already installed in framework but not managed by Brooklyn; cannot install or update through Brooklyn");
+                    // bundle already installed to OSGi subsystem but brooklyn not aware of it;
+                    // this will often happen on a karaf restart so don't be too strict!
+                    // in this case let's uninstall it to make sure we have the right bundle and checksum
+                    // (in case where user has replaced a JAR file in persisted state,
+                    // or where they osgi installed something and are now uploading it or something else) 
+                    // but let's just assume it's the same; worst case if not user will
+                    // have to uninstall it then reinstall it to do the replacement
+                    // (means you can't just replace a JAR in persisted state however)
+                    log.debug("Brooklyn install of "+result.getMetadata().getVersionedName()+" detected already loaded in OSGi; uninstalling that to reinstall as Brooklyn-managed");
+                    b.get().uninstall();
                 }
                 // normal install
                 updating = false;
@@ -337,7 +344,6 @@ class OsgiArchiveInstaller {
             startedInstallation = true;
             try (InputStream fin = new FileInputStream(zipFile)) {
                 if (!updating) {
-                    // install new
                     assert result.getBundle()==null;
                     result.bundle = osgiManager.framework.getBundleContext().installBundle(result.getMetadata().getOsgiUniqueUrl(), fin);
                 } else {