package org.opennaas.extensions.router.capability.chassis.shell; import org.apache.felix.gogo.commands.Argument; import org.apache.felix.gogo.commands.Command; import org.opennaas.core.resources.IResource; import org.opennaas.core.resources.shell.GenericKarafCommand; import org.opennaas.extensions.router.capability.chassis.IChassisCapability; import org.opennaas.extensions.router.model.LogicalPort; import org.opennaas.extensions.router.model.NetworkPort; @Command(scope = "chassis", name = "setEncapsulationlabel", description = "Set an encapsulation label in a given interface.") public class SetEncapsulationLabelCommand extends GenericKarafCommand { @Argument(index = 0, name = "resourceType:resourceName", description = "The resource name.", required = true, multiValued = false) private String resourceId; @Argument(index = 1, name = "interfaceName", description = "The interface where to set the encapsulation label", required = true, multiValued = false) private String interfaceName; @Argument(index = 2, name = "label", description = "the label value", required = false, multiValued = false) private String label = ""; @Override protected Object doExecute() throws Exception { printInitCommand("set Encapsulation label"); try { checkArguments(); LogicalPort iface = createParams(interfaceName); IResource resource = getResourceFromFriendlyName(resourceId); IChassisCapability chassisCapability = (IChassisCapability) resource.getCapabilityByInterface(IChassisCapability.class); chassisCapability.setEncapsulationLabel(iface, label); } catch (Exception e) { printError("Error setting vlan."); printError(e); printEndCommand(); return null; } printEndCommand(); return null; } private void checkArguments() throws Exception { // FIXME It is necessary to setvlans in loopback if we want configure LRs if (isLoopbackInterfaceName(interfaceName)) { throw new UnsupportedOperationException("Encapsulation in loopback interfaces is not supported."); } } private LogicalPort createParams(String interfaceName) throws Exception { LogicalPort iface; if (isPhysicalInterfaceName(interfaceName)) { iface = new LogicalPort(); iface.setName(interfaceName); } else { iface = new NetworkPort(); String[] interfaceNameAndPortNumber = splitInterfaces(interfaceName); iface.setName(interfaceNameAndPortNumber[0]); ((NetworkPort) iface).setPortNumber(Integer.parseInt(interfaceNameAndPortNumber[1])); } return iface; } private boolean isLoopbackInterfaceName(String interfaceName) { return interfaceName.startsWith("lo"); } private boolean isPhysicalInterfaceName(String interfaceName) { return !(interfaceName.contains(".")); } }