package org.opennaas.extensions.router.opener.actionssets.actions;
import org.opennaas.core.resources.action.ActionException;
import org.opennaas.core.resources.action.ActionResponse;
import org.opennaas.core.resources.protocol.IProtocolSessionManager;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.extensions.router.capability.ip.IPActionSet;
import org.opennaas.extensions.router.model.IPProtocolEndpoint;
import org.opennaas.extensions.router.model.LogicalPort;
import org.opennaas.extensions.router.model.NetworkPort;
import org.opennaas.extensions.router.model.ProtocolEndpoint.ProtocolIFType;
import org.opennaas.extensions.router.model.utils.IPUtilsHelper;
import org.opennaas.extensions.router.opener.client.rpc.SetInterfaceIPRequest;
import org.opennaas.extensions.router.opener.client.rpc.SetInterfaceResponse;
import org.opennaas.extensions.router.opener.client.rpc.Utils;
public class SetIPv4Action extends OpenerAction {
@Override
public ActionResponse execute(IProtocolSessionManager protocolSessionManager)
throws ActionException {
SetInterfaceIPRequest request = prepareRequest((NetworkPort) params);
try {
SetInterfaceResponse openerResponse = getOpenerProtocolSession(protocolSessionManager).getOpenerClientForUse().setInterfaceIPAddress(
request, 0);
ActionResponse response = actionResposeFromSetInterfaceResponse(openerResponse);
response.setActionID(IPActionSet.SET_IPv4);
return response;
} catch (ProtocolException e) {
throw new ActionException(e);
} catch (Exception e) {
throw new ActionException(e);
}
}
@Override
public boolean checkParams(Object params) throws ActionException {
if (params == null || !(params instanceof NetworkPort))
throw new ActionException("Invalid parameters for action " + getActionID());
if (((LogicalPort) params).getProtocolEndpoint().isEmpty())
throw new ActionException("No IP address given to action " + getActionID());
if (!(((LogicalPort) params).getProtocolEndpoint().get(0) instanceof IPProtocolEndpoint)) {
throw new ActionException("No IP address given to action " + getActionID());
}
if (((IPProtocolEndpoint) (((LogicalPort) params).getProtocolEndpoint().get(0))).getProtocolIFType() == null ||
!((IPProtocolEndpoint) (((LogicalPort) params).getProtocolEndpoint().get(0))).getProtocolIFType().equals(ProtocolIFType.IPV4)) {
throw new ActionException("Invalid IP protocol type given to action " + getActionID() + ". Required " + ProtocolIFType.IPV4);
}
if (((IPProtocolEndpoint) (((LogicalPort) params).getProtocolEndpoint().get(0))).getIPv4Address() == null ||
((IPProtocolEndpoint) (((LogicalPort) params).getProtocolEndpoint().get(0))).getIPv4Address().isEmpty()) {
throw new ActionException("No IP address given to action " + getActionID());
}
return true;
}
private SetInterfaceIPRequest prepareRequest(NetworkPort subInterface) {
IPProtocolEndpoint ipPep = (IPProtocolEndpoint) subInterface.getProtocolEndpoint().get(0);
String subInterfaceName;
if (subInterface.getPortNumber() == 0) {
subInterfaceName = subInterface.getName();
} else {
subInterfaceName = subInterface.getName() + "." + subInterface.getPortNumber();
}
// assuming ipPep.getProtocolIFType().equals(ProtocolIFType.IPV4)
String prefixLength = IPUtilsHelper.parseLongToShortIpv4NetMask(ipPep.getSubnetMask());
return Utils.createSetInterfaceIPRequest(subInterfaceName, ipPep.getIPv4Address(), prefixLength);
}
}