package org.opennaas.extensions.router.capability.vrrp.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.ResourceException;
import org.opennaas.core.resources.command.CommandException;
import org.opennaas.core.resources.shell.GenericKarafCommand;
import org.opennaas.extensions.router.capability.vrrp.IVRRPCapability;
import org.opennaas.extensions.router.model.IPProtocolEndpoint;
import org.opennaas.extensions.router.model.NetworkPort;
import org.opennaas.extensions.router.model.ProtocolEndpoint.ProtocolIFType;
import org.opennaas.extensions.router.model.VRRPGroup;
import org.opennaas.extensions.router.model.VRRPProtocolEndpoint;
import org.opennaas.extensions.router.model.utils.IPUtilsHelper;
/**
* @author Julio Carlos Barrera
*/
@Command(scope = "vrrp", name = "configure", description = "Configure VRRP in given IP Address in an interface of a router")
public class ConfigureVRRPCommand extends GenericKarafCommand {
@Argument(index = 0, name = "resourceType:resourceName", description = "Name of the router to configure VRRP", required = true, multiValued =
false)
private String resourceId;
@Argument(index = 1, name = "interfaceName", description = "Name of the interface in the router", required = true, multiValued =
false)
private String interfaceName;
@Argument(index = 2, name = "interfaceIPAddress", description = "IP address of the interface inside the VirtualIPAddress range.", required = true, multiValued =
false)
private String interfaceIPAddress;
@Argument(index = 3, name = "vrrpGroupId", description = "The VRRP group ID", required = true, multiValued =
false)
private int vrrpGroupId;
@Argument(index = 4, name = "priority", description = "The priority of the router inside this VRRP group", required = true, multiValued =
false)
private int priority;
@Argument(index = 5, name = "virtualIPAddress", description = "The virtual IP address", required = true, multiValued =
false)
private String virtualIPAddress;
@Argument(index = 6, name = "interfaceLinkAddress", description = "IP address of the interface inside the VirtualLinkAddress range.", required = false, multiValued =
false)
private String interfaceLinkAddress;
@Argument(index = 7, name = "virtualLinkAddress", description = "The virtual link address range.", required = false, multiValued =
false)
private String virtualLinkAddress;
@Argument(index = 8, name = "advertisementPrefix", description = "IPv6 prefix to configure in router advertisement.", required = false, multiValued =
false)
private String advertisementPrefix;
@Override
protected Object doExecute() throws Exception {
printInitCommand("Configure VRRP");
try {
IResource router = getResourceFromFriendlyName(resourceId);
IVRRPCapability vrrpCapability = (IVRRPCapability) router.getCapabilityByInterface(IVRRPCapability.class);
VRRPGroup vrrpGroup = new VRRPGroup();
VRRPProtocolEndpoint vrrpProtocolEndpoint = new VRRPProtocolEndpoint();
// get interface name and port
NetworkPort routerInterface = buildNetworkPort();
IPProtocolEndpoint interfaceIPProtocolEndpoint1 = buildIPProtocolEndpoint(interfaceIPAddress);
vrrpProtocolEndpoint.setPriority(priority);
vrrpGroup.setVrrpName(vrrpGroupId);
vrrpGroup.setVirtualIPAddress(virtualIPAddress);
interfaceIPProtocolEndpoint1.addLogiaclPort(routerInterface);
vrrpProtocolEndpoint.bindServiceAccessPoint(interfaceIPProtocolEndpoint1);
vrrpProtocolEndpoint.setProtocolIFType(interfaceIPProtocolEndpoint1.getProtocolIFType());
vrrpProtocolEndpoint.setService(vrrpGroup);
if (interfaceIPProtocolEndpoint1.getProtocolIFType().equals(ProtocolIFType.IPV6)) {
if (interfaceLinkAddress == null || virtualLinkAddress == null || advertisementPrefix == null)
throw new CommandException("InterfaceLinkAddress, VirtualLinkAddress and advertisementPrefix have to be set in IPv6 VRRP.");
IPProtocolEndpoint interfaceIPProtocolEndpoint2 = buildIPProtocolEndpoint(interfaceLinkAddress);
interfaceIPProtocolEndpoint2.addLogiaclPort(routerInterface);
vrrpProtocolEndpoint.bindServiceAccessPoint(interfaceIPProtocolEndpoint2);
vrrpGroup.setVirtualLinkAddress(virtualLinkAddress);
IPProtocolEndpoint interfaceIPProtocolEndpoint3 = buildIPProtocolEndpoint(advertisementPrefix);
interfaceIPProtocolEndpoint3.addLogiaclPort(routerInterface);
vrrpProtocolEndpoint.bindServiceAccessPoint(interfaceIPProtocolEndpoint3);
}
vrrpCapability.configureVRRP(vrrpProtocolEndpoint);
} catch (ResourceException e) {
printError(e);
printEndCommand();
return -1;
} catch (Exception e) {
printError("Error configuring VRRP.");
printError(e);
printEndCommand();
return -1;
}
printEndCommand();
return null;
}
private NetworkPort buildNetworkPort() throws Exception {
NetworkPort netPort = new NetworkPort();
String[] argsInterface = splitInterfaces(interfaceName);
String interfaceName = argsInterface[0];
int port = Integer.parseInt(argsInterface[1]);
netPort.setName(interfaceName);
netPort.setPortNumber(port);
return netPort;
}
private IPProtocolEndpoint buildIPProtocolEndpoint(String ipAddress) throws CommandException {
IPProtocolEndpoint pE = new IPProtocolEndpoint();
if (IPUtilsHelper.isIPv4ValidAddress(ipAddress)) {
String address = IPUtilsHelper.getAddressFromIP(ipAddress);
String mask = IPUtilsHelper.getPrefixFromIp(ipAddress);
pE.setIPv4Address(address);
pE.setSubnetMask(IPUtilsHelper.parseShortToLongIpv4NetMask(mask));
pE.setProtocolIFType(ProtocolIFType.IPV4);
} else if (IPUtilsHelper.isIPv6ValidAddress(ipAddress)) {
String address = IPUtilsHelper.getAddressFromIP(ipAddress);
String prefix = IPUtilsHelper.getPrefixFromIp(ipAddress);
pE.setIPv6Address(address);
pE.setPrefixLength(Short.valueOf(prefix));
pE.setProtocolIFType(ProtocolIFType.IPV6);
} else
throw new CommandException("Invalid IP format.");
return pE;
}
}