package org.opennaas.extensions.bod.capability.l2bod.shell; import java.util.List; import java.util.NoSuchElementException; import org.apache.felix.gogo.commands.Argument; import org.apache.felix.gogo.commands.Command; import org.apache.felix.gogo.commands.Option; import org.joda.time.DateTime; import org.joda.time.format.ISODateTimeFormat; import org.opennaas.core.resources.IResource; import org.opennaas.core.resources.shell.GenericKarafCommand; import org.opennaas.extensions.bod.capability.l2bod.IL2BoDCapability; import org.opennaas.extensions.bod.capability.l2bod.RequestConnectionParameters; import org.opennaas.extensions.network.model.NetworkModel; import org.opennaas.extensions.network.model.NetworkModelHelper; import org.opennaas.extensions.network.model.topology.Interface; import org.opennaas.extensions.network.model.topology.NetworkElement; @Command(scope = "l2bod", name = "requestConnection", description = "Request L2 connectivity between specified interfaces.") public class RequestConnectionCommand extends GenericKarafCommand { @Argument(index = 0, name = "resourceType:resourceName", description = "The resource id to request the connectivity.", required = true, multiValued = false) private String resourceId; @Argument(index = 1, name = "interface1", description = "The name of interface 1 to connect", required = true, multiValued = false) private String interfaceName1; @Argument(index = 2, name = "interface2", description = "The name of interface 2 to connect", required = true, multiValued = false) private String interfaceName2; @Option(name = "--vlanid", aliases = { "-v" }, description = "VLAN ID to use for vlan-tagging", multiValued = false) private int vlanid = -1; @Option(name = "--dstvlanid", description = "VLAN ID to use for vlan-tagging in interface2", multiValued = false) private int vlanid2 = -1; @Option(name = "--starttime", aliases = { "--start", "-s" }, description = "Start time (yyyy-MM-dd'T'HH:mm:ssZZ)", multiValued = false) private String startTime; @Option(name = "--endtime", aliases = { "--end", "-e" }, description = "End time (yyyy-MM-dd'T'HH:mm:ssZZ)", required = true, multiValued = false) private String endTime; @Option(name = "--capacity", aliases = { "-c" }, description = "Capacity in MB/s", required = true, multiValued = false) private int capacity; @Override protected Object doExecute() { printInitCommand("request connectivity of resource: " + resourceId + " and interfaces: " + interfaceName1 + " - " + interfaceName2); try { IResource resource = getResourceFromFriendlyName(resourceId); IL2BoDCapability ipCapability = (IL2BoDCapability) resource.getCapabilityByInterface(IL2BoDCapability.class); ipCapability.requestConnection(createParameters(resource)); } catch (Exception e) { printError("Error requesting connectivity for resource: " + resourceId); printError(e); return -1; } finally { printEndCommand(); } return null; } private RequestConnectionParameters createParameters(IResource resource) { NetworkModel model = (NetworkModel) resource.getModel(); if (vlanid2 == -1) { // use vlanid for both endpoints return new RequestConnectionParameters(getInterface(model, interfaceName1), getInterface(model, interfaceName2), capacity * 1000000L, vlanid, parseISO8601Date(startTime), parseISO8601Date(endTime)); } else { return new RequestConnectionParameters(getInterface(model, interfaceName1), getInterface(model, interfaceName2), capacity * 1000000L, vlanid, vlanid2, parseISO8601Date(startTime), parseISO8601Date(endTime)); } } private DateTime parseISO8601Date(String s) { return (s == null) ? new DateTime() : ISODateTimeFormat.dateTimeNoMillis().parseDateTime(s); } private Interface getInterface(NetworkModel model, String name) { List<NetworkElement> elements = model.getNetworkElements(); Interface i = NetworkModelHelper.getInterfaceByName(elements, name); if (i == null) { throw new NoSuchElementException("No such interface: " + name); } return i; } }