/* * 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.obr.shell; import org.apache.felix.bundlerepository.Repository; import org.apache.felix.bundlerepository.Resource; 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.cellar.core.shell.completer.AllGroupsCompleter; import org.apache.karaf.cellar.obr.ClusterObrUrlEvent; import org.apache.karaf.cellar.obr.Constants; import org.apache.karaf.cellar.obr.ObrBundleInfo; import org.apache.karaf.shell.api.action.Argument; import org.apache.karaf.shell.api.action.Command; import org.apache.karaf.shell.api.action.Completion; import org.apache.karaf.shell.api.action.lifecycle.Reference; import org.apache.karaf.shell.api.action.lifecycle.Service; import java.util.Set; @Command(scope = "cluster", name = "obr-add-url", description = "Add an OBR URL in a cluster group") @Service public class ObrAddUrlCommand extends ObrCommandSupport { @Argument(index = 0, name = "group", description = "The cluster group name", required = true, multiValued = false) @Completion(AllGroupsCompleter.class) String groupName; @Argument(index = 1, name = "url", description = "The OBR URL.", required = true, multiValued = false) String url; @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; } // check if the URL is allowed if (!isAllowed(group, Constants.URLS_CONFIG_CATEGORY, url, EventType.OUTBOUND)) { System.err.println("OBR URL " + url + " is blocked outbound for cluster group " + groupName); return null; } // update the OBR URLs in the cluster group Set<String> clusterUrls = clusterManager.getSet(Constants.URLS_DISTRIBUTED_SET_NAME + Configurations.SEPARATOR + groupName); clusterUrls.add(url); // update the OBR bundles in the cluster group Set<ObrBundleInfo> clusterBundles = clusterManager.getSet(Constants.BUNDLES_DISTRIBUTED_SET_NAME + Configurations.SEPARATOR + groupName); synchronized(obrService) { Repository repository = obrService.addRepository(url); Resource[] resources = repository.getResources(); for (Resource resource : resources) { ObrBundleInfo info = new ObrBundleInfo(resource.getPresentationName(),resource.getSymbolicName(), resource.getVersion().toString()); clusterBundles.add(info); } obrService.removeRepository(url); } // broadcast a cluster event ClusterObrUrlEvent event = new ClusterObrUrlEvent(url, Constants.URL_ADD_EVENT_TYPE); event.setSourceGroup(group); event.setSourceNode(clusterManager.getNode()); eventProducer.produce(event); return null; } public EventProducer getEventProducer() { return eventProducer; } public void setEventProducer(EventProducer eventProducer) { this.eventProducer = eventProducer; } }