You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2016/10/14 15:08:03 UTC
[1/2] karaf-cellar git commit: Fix cellar-bundle headers
Repository: karaf-cellar
Updated Branches:
refs/heads/master 8eeb60202 -> 725746548
Fix cellar-bundle headers
Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/8cabd830
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/8cabd830
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/8cabd830
Branch: refs/heads/master
Commit: 8cabd830082ec28ae0549d4b668e04f41cf27a04
Parents: 8eeb602
Author: Jean-Baptiste Onofr� <jb...@apache.org>
Authored: Fri Oct 14 17:01:01 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Fri Oct 14 17:01:01 2016 +0200
----------------------------------------------------------------------
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/8cabd830/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0f63da9..bdcba91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -492,8 +492,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
- <source>1.6</source>
- <target>1.6</target>
+ <source>1.7</source>
+ <target>1.7</target>
</configuration>
</plugin>
<plugin>
[2/2] karaf-cellar git commit: [KARAF-4768] Add bundle update support
Posted by jb...@apache.org.
[KARAF-4768] Add bundle update support
Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/72574654
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/72574654
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/72574654
Branch: refs/heads/master
Commit: 725746548061e0bf9f3407d97f5788639611db90
Parents: 8cabd83
Author: Jean-Baptiste Onofr� <jb...@apache.org>
Authored: Fri Oct 14 17:07:06 2016 +0200
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Fri Oct 14 17:07:06 2016 +0200
----------------------------------------------------------------------
bundle/pom.xml | 3 +-
.../karaf/cellar/bundle/BundleEventHandler.java | 2 +
.../apache/karaf/cellar/bundle/BundleState.java | 2 +
.../karaf/cellar/bundle/BundleSupport.java | 44 ++++++-
.../bundle/management/CellarBundleMBean.java | 19 +++
.../internal/CellarBundleMBeanImpl.java | 62 ++++++++++
.../cellar/bundle/shell/StartBundleCommand.java | 2 +-
.../bundle/shell/UninstallBundleCommand.java | 2 +-
.../bundle/shell/UpdateBundleCommand.java | 118 +++++++++++++++++++
9 files changed, 245 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/pom.xml
----------------------------------------------------------------------
diff --git a/bundle/pom.xml b/bundle/pom.xml
index 640700c..e2fc6eb 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -98,7 +98,8 @@
<Private-Package>
org.apache.karaf.cellar.bundle.management.internal,
org.apache.karaf.cellar.bundle.internal.osgi,
- org.apache.karaf.util.tracker;-split-package:=merge-first
+ org.apache.karaf.util.tracker;-split-package:=merge-first,
+ org.apache.karaf.util.bundles;-split-package:=merge-first
</Private-Package>
</instructions>
</configuration>
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
index 2da1cca..109cad3 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleEventHandler.java
@@ -123,6 +123,8 @@ public class BundleEventHandler extends BundleSupport implements EventHandler<Cl
} else {
LOGGER.warn("CELLAR BUNDLE: unable to find bundle located {} on node", event.getLocation());
}
+ } else if (event.getType() == BundleState.UPDATE) {
+ updateBundle(event.getSymbolicName(), event.getVersion(), event.getLocation());
}
} else
LOGGER.trace("CELLAR BUNDLE: bundle {} is marked BLOCKED INBOUND for cluster group {}", event.getSymbolicName(), event.getSourceGroup().getName());
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
index df6154a..a9c1519 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
@@ -20,6 +20,8 @@ import java.io.Serializable;
*/
public class BundleState implements Serializable {
+ public static final int UPDATE = 555;
+
private static final long serialVersionUID = 5933673686648413918L;
private long id;
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java
index fd3f81f..242dc04 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSupport.java
@@ -17,10 +17,14 @@ import org.apache.karaf.cellar.core.CellarSupport;
import org.apache.karaf.features.BundleInfo;
import org.apache.karaf.features.Feature;
import org.apache.karaf.features.FeaturesService;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-
+import org.apache.karaf.util.bundles.BundleUtils;
+import org.osgi.framework.*;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@@ -115,19 +119,47 @@ public class BundleSupport extends CellarSupport {
*
* @param symbolicName the bundle symbolic name.
* @param version the bundle version.
+ * @param location the bundle update location.
* @throws BundleException in case of update failure.
*/
- public void updateBundle(String symbolicName, String version) throws BundleException {
+ public void updateBundle(String symbolicName, String version, String location) throws BundleException {
Bundle[] bundles = getBundleContext().getBundles();
if (bundles != null) {
for (Bundle bundle : bundles) {
if (bundle.getSymbolicName().equals(symbolicName) && bundle.getHeaders().get("Bundle-Version").toString().equals(version)) {
- bundle.update();
+ if (location != null) {
+ try {
+ update(bundle, new URL(location));
+ } catch (Exception e) {
+ throw new BundleException("Can't update bundle", e);
+ }
+ } else {
+ String loc = bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_UPDATELOCATION);
+ if (loc != null && !loc.equals(bundle.getLocation())) {
+ try {
+ update(bundle, new URL(loc));
+ } catch (Exception e) {
+ throw new BundleException("Can't update bundle", e);
+ }
+ } else {
+ bundle.update();
+ }
+ }
}
}
}
}
+ private void update(Bundle bundle, URL location) throws IOException, BundleException {
+ try (InputStream is = location.openStream()) {
+ File file = BundleUtils.fixBundleWithUpdateLocation(is, location.toString());
+ try (FileInputStream fis = new FileInputStream(file)) {
+ bundle.update(fis);
+ }
+ file.delete();
+ }
+ }
+
/**
* Get the list of features where the bundle is belonging.
*
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/CellarBundleMBean.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/CellarBundleMBean.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/CellarBundleMBean.java
index 58d791d..5704902 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/CellarBundleMBean.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/CellarBundleMBean.java
@@ -67,6 +67,25 @@ public interface CellarBundleMBean {
void stop(String group, String id) throws Exception;
/**
+ * Update a bundle in a cluster group.
+ *
+ * @param group the cluster group name.
+ * @param id the bundle id.
+ * @throws Exception in case of update failure.
+ */
+ void update(String group, String id) throws Exception;
+
+ /**
+ * Update a bundle in a cluster group using a given location.
+ *
+ * @param group the cluster group name.
+ * @param id the bundle id.
+ * @param location the update bundle location.
+ * @throws Exception in case of update failure.
+ */
+ void update(String group, String id, String location) throws Exception;
+
+ /**
* Updating blocking policy for a given bundle pattern.
*
* @param group the cluster group name where to apply the blocking policy.
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
index 5bae2b0..908bc08 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
@@ -333,6 +333,68 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
}
@Override
+ public void update(String groupName, String id, String updateLocation) throws Exception {
+ // check if the cluster group exists
+ Group group = groupManager.findGroupByName(groupName);
+ if (group == null) {
+ throw new IllegalArgumentException("Cluster group " + groupName + " doesn't exist");
+ }
+
+ // check if the producer is ON
+ if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+ throw new IllegalStateException("Cluster event producer is OFF for this node");
+ }
+
+ CellarSupport support = new CellarSupport();
+ support.setClusterManager(this.clusterManager);
+ support.setGroupManager(this.groupManager);
+ support.setConfigurationAdmin(this.configurationAdmin);
+
+ // update the cluster group
+ ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+ try {
+ Map<String, BundleState> clusterBundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
+
+ List<String> bundles = selector(id, gatherBundles(groupName));
+
+ for (String bundle : bundles) {
+ BundleState state = clusterBundles.get(bundle);
+ if (state == null) {
+ continue;
+ }
+ String location = state.getLocation();
+ if (updateLocation != null) {
+ location = updateLocation;
+ }
+
+ // check if the bundle location is allowed outbound
+ if (!support.isAllowed(group, Constants.CATEGORY, location, EventType.OUTBOUND)) {
+ continue;
+ }
+
+ // update the cluster state
+ state.setLocation(location);
+ clusterBundles.put(bundle, state);
+
+ // broadcast the cluster event
+ String[] split = bundle.split("/");
+ ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, BundleState.UPDATE);
+ event.setSourceGroup(group);
+ event.setSourceNode(clusterManager.getNode());
+ eventProducer.produce(event);
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ }
+ }
+
+ @Override
+ public void update(String groupName, String id) throws Exception {
+ update(groupName, id, null);
+ }
+
+ @Override
public void block(String groupName, String bundlePattern, boolean whitelist, boolean blacklist, boolean in, boolean out) throws Exception {
List<String> patterns = new ArrayList<String>();
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
index 059da85..d53dc06 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/StartBundleCommand.java
@@ -64,7 +64,7 @@ public class StartBundleCommand extends BundleCommandSupport {
for (String bundle : bundles) {
BundleState state = clusterBundles.get(bundle);
if (state == null) {
- System.err.println("Bundle " + state + " not found in cluster group " + groupName);
+ System.err.println("Bundle " + bundle + " not found in cluster group " + groupName);
}
String location = state.getLocation();
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
index 8584a39..c45eab6 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UninstallBundleCommand.java
@@ -30,7 +30,7 @@ import org.osgi.framework.Bundle;
import java.util.List;
import java.util.Map;
-@Command(scope = "cluster", name = "bundle-uninstall", description = "Uninstall a bundle from a cluster group")
+@Command(scope = "cluster", name = "bundle-uninstall", description = "Uninstall bundles from a cluster group")
@Service
public class UninstallBundleCommand extends BundleCommandSupport {
http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/72574654/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UpdateBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UpdateBundleCommand.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UpdateBundleCommand.java
new file mode 100644
index 0000000..a86183d
--- /dev/null
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/UpdateBundleCommand.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.cellar.bundle.shell;
+
+import org.apache.karaf.cellar.bundle.BundleState;
+import org.apache.karaf.cellar.bundle.ClusterBundleEvent;
+import org.apache.karaf.cellar.bundle.Constants;
+import org.apache.karaf.cellar.core.CellarSupport;
+import org.apache.karaf.cellar.core.Configurations;
+import org.apache.karaf.cellar.core.Group;
+import org.apache.karaf.cellar.core.control.SwitchStatus;
+import org.apache.karaf.cellar.core.event.EventProducer;
+import org.apache.karaf.cellar.core.event.EventType;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Reference;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Command(scope = "cluster", name = "bundle-update", description = "Update a bundle in a cluster group")
+@Service
+public class UpdateBundleCommand extends BundleCommandSupport {
+
+ @Argument(index = 2, name = "location", description = "The update bundle location", required = false, multiValued = false)
+ String updateLocation;
+
+ @Reference
+ private EventProducer eventProducer;
+
+ @Override
+ public Object doExecute() throws Exception {
+ // check if the group exists
+ Group group = groupManager.findGroupByName(groupName);
+ if (group == null) {
+ System.err.println("Cluster group " + groupName + " doesn't exist");
+ return null;
+ }
+
+ // check if the producer is ON
+ if (eventProducer.getSwitch().getStatus().equals(SwitchStatus.OFF)) {
+ System.err.println("Cluster event producer is OFF");
+ return null;
+ }
+
+ ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+ try {
+ // get cluster bundles
+ Map<String, BundleState> clusterBundles = clusterManager.getMap(Constants.BUNDLE_MAP + Configurations.SEPARATOR + groupName);
+
+ List<String> bundles = selector(gatherBundles(true));
+
+ if (bundles.size() != 1) {
+ System.err.println("Update requires an unique bundle to update");
+ return null;
+ }
+
+ String bundle = bundles.get(0);
+ BundleState state = clusterBundles.get(bundle);
+ if (state == null) {
+ System.err.println("Bundle " + bundle + " not found in cluster group " + groupName);
+ return null;
+ }
+
+ String location = state.getLocation();
+ if (updateLocation != null) {
+ location = updateLocation;
+ }
+
+ // check if the bundle is allowed
+ CellarSupport support = new CellarSupport();
+ support.setClusterManager(this.clusterManager);
+ support.setGroupManager(this.groupManager);
+ support.setConfigurationAdmin(this.configurationAdmin);
+ if (!support.isAllowed(group, Constants.CATEGORY, location, EventType.OUTBOUND)) {
+ System.err.println("Bundle location " + location + " is blocked outbound for cluster group " + groupName);
+ }
+
+ // update cluster state
+ state.setLocation(updateLocation);
+ clusterBundles.put(bundle, state);
+
+ // broadcast the cluster event
+ String[] split = bundle.split("/");
+ ClusterBundleEvent event = new ClusterBundleEvent(split[0], split[1], location, BundleState.UPDATE);
+ event.setSourceGroup(group);
+ event.setSourceNode(clusterManager.getNode());
+ eventProducer.produce(event);
+ } finally {
+ Thread.currentThread().setContextClassLoader(originalClassLoader);
+ }
+
+ return null;
+ }
+
+ public EventProducer getEventProducer() {
+ return eventProducer;
+ }
+
+ public void setEventProducer(EventProducer eventProducer) {
+ this.eventProducer = eventProducer;
+ }
+
+}