blob: ea4cdf46c983b0255d9feddcc8da393ce13c14b9 [file] [log] [blame]
/*
* 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.shell;
import org.apache.karaf.cellar.core.Configurations;
import org.apache.karaf.cellar.core.Group;
import org.apache.karaf.cellar.core.Synchronizer;
import org.apache.karaf.shell.api.action.Argument;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.Option;
import org.apache.karaf.shell.api.action.lifecycle.Reference;
import org.apache.karaf.shell.api.action.lifecycle.Service;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
@Command(scope = "cluster", name = "sync", description = "Manipulate the synchronizers")
@Service
public class SyncCommand extends ClusterCommandSupport {
@Option(name = "-g", aliases = { "--group" }, description = "The cluster group name", required = false, multiValued = false)
private String groupName;
@Option(name = "-b", aliases = { "--bundle" }, description = "Cluster bundle support", required = false, multiValued = false)
private boolean bundleSync = false;
@Option(name = "-c", aliases = { "--config" }, description = "Cluster config support", required = false, multiValued = false)
private boolean configSync = false;
@Option(name = "-f", aliases = { "--feature" }, description = "Cluster feature support", required = false, multiValued = false)
private boolean featuresSync = false;
@Option(name = "-o", aliases = { "--obr" }, description = "Cluster OBR support", required = false, multiValued = false)
private boolean obrSync = false;
@Argument(name = "policy", description = "The definition of the sync policy for the given cluster resource", required = false, multiValued = false)
private String policy;
@Reference
private ConfigurationAdmin configurationAdmin;
@Reference
private BundleContext bundleContext;
@Override
protected Object doExecute() throws Exception {
boolean allResources = false;
// if the user didn't provide any resource, we consider all
if (!bundleSync && !configSync && !featuresSync && !obrSync) {
allResources = true;
}
Set<Group> groups;
if (groupName == null || groupName.isEmpty()) {
groups = groupManager.listLocalGroups();
} else {
groups = new HashSet<Group>();
if (groupManager.findGroupByName(groupName) == null) {
System.err.println("Cluster group " + groupName + " doesn't exist");
return null;
}
groups.add(groupManager.findGroupByName(groupName));
}
if (policy == null || policy.isEmpty()) {
// we are in sync mode
// constructing the target cluster groups
for (Group group : groups) {
System.out.println("Synchronizing cluster group " + group.getName());
if (bundleSync || allResources) {
doSync("bundle", group);
}
if (configSync || allResources) {
doSync("config", group);
}
if (featuresSync || allResources) {
doSync("feature", group);
}
if (obrSync || allResources) {
doSync("obr.urls", group);
}
}
} else {
// we are in set mode
if (!policy.equalsIgnoreCase("cluster") && !policy.equalsIgnoreCase("node") && !policy.equalsIgnoreCase("clusterOnly") && !policy.equalsIgnoreCase("nodeOnly") && !policy.equalsIgnoreCase("disabled")) {
System.err.println("The sync policy " + policy + " is not valid. Valid sync policies are: cluster, node, clusterOnly, nodeOnly, disabled");
return null;
}
for (Group group : groups) {
System.out.println("Updating sync policy for cluster group " + group.getName());
if (bundleSync || allResources) {
updateSync("bundle", group, policy);
}
if (configSync || allResources) {
updateSync("config", group, policy);
}
if (featuresSync || allResources) {
updateSync("feature", group, policy);
}
if (obrSync || allResources) {
updateSync("obr.urls", group, policy);
}
}
}
return null;
}
private void doSync(String resource, Group group) throws Exception {
// looking for the resource synchronizer
System.out.print("\t" + resource + ": ");
ServiceReference[] references = bundleContext.getAllServiceReferences(Synchronizer.class.getName(), "(resource=" + resource + ")");
if (references != null && references.length > 0) {
for (ServiceReference reference : references) {
Synchronizer synchronizer = (Synchronizer) bundleContext.getService(reference);
synchronizer.sync(group);
bundleContext.ungetService(reference);
}
System.out.println("done");
} else {
System.out.println("No synchronizer found for " + resource);
}
}
private void updateSync(String resource, Group group, String policy) throws Exception {
System.out.print("\t" + resource + ": ");
Configuration configuration = configurationAdmin.getConfiguration(Configurations.GROUP, null);
if (configuration != null) {
Dictionary properties = configuration.getProperties();
if (properties == null)
properties = new Properties();
properties.put(group.getName() + "." + resource + ".sync", policy);
configuration.update(properties);
System.out.println("done");
}
}
public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
this.configurationAdmin = configurationAdmin;
}
}