package org.opennaas.extensions.roadm.wonesys.commandsets.test;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opennaas.core.protocols.sessionmanager.ProtocolManager;
import org.opennaas.core.protocols.sessionmanager.ProtocolSessionManager;
import org.opennaas.core.resources.action.ActionException;
import org.opennaas.core.resources.action.ActionResponse;
import org.opennaas.core.resources.action.ActionResponse.STATUS;
import org.opennaas.core.resources.command.Response;
import org.opennaas.core.resources.command.Response.Status;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.protocol.ProtocolSessionContext;
import org.opennaas.extensions.roadm.wonesys.actionsets.actions.RefreshModelConnectionsAction;
import org.opennaas.extensions.roadm.wonesys.commandsets.WonesysCommand;
import org.opennaas.extensions.roadm.wonesys.commandsets.test.mock.MockProtocolSessionManager;
import org.opennaas.extensions.roadm.wonesys.protocols.WonesysProtocolSession;
import org.opennaas.extensions.roadm.wonesys.protocols.WonesysProtocolSessionFactory;
import org.opennaas.extensions.router.model.FCPort;
import org.opennaas.extensions.router.model.LogicalDevice;
import org.opennaas.extensions.router.model.LogicalPort;
import org.opennaas.extensions.router.model.NetworkPort;
import org.opennaas.extensions.router.model.opticalSwitch.DWDMChannel;
import org.opennaas.extensions.router.model.opticalSwitch.FiberChannel;
import org.opennaas.extensions.router.model.opticalSwitch.FiberConnection;
import org.opennaas.extensions.router.model.opticalSwitch.WDMChannelPlan;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.WDMFCPort;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.ProteusOpticalSwitch;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.cards.ProteusOpticalSwitchCard;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.cards.ProteusOpticalSwitchCard.CardType;
import org.opennaas.extensions.router.model.opticalSwitch.dwdm.proteus.cards.WonesysDropCard;
public class RefreshModelConnectionsActionTest {
Log log = LogFactory.getLog(RefreshModelConnectionsActionTest.class);
WonesysProtocolSession session;
// //
private static RefreshModelConnectionsAction action;
private String resourceId = "pedrosa";
// static ActionTestHelper helper;
// static ProtocolSessionManager protocolsessionmanager;
@Before
public void init() {
action = new RefreshModelConnectionsAction();
ProteusOpticalSwitch opticalSwitch1 = new ProteusOpticalSwitch();
opticalSwitch1.setName(resourceId);
action.setModelToUpdate(opticalSwitch1);
log.info("init test");
}
@Test
public void testRefreshModelMockExecute() {
log.info("Testing Action with mock connection");
try {
ActionResponse response = action.execute(getMockProtocolSessionManager());
Assert.assertTrue(response.getStatus().equals(STATUS.OK));
for (Response resp : response.getResponses()) {
Assert.assertTrue(resp.getStatus().equals(Status.OK));
}
ProteusOpticalSwitch opticalSwitch = (ProteusOpticalSwitch) action.getModelToUpdate();
checkModelIsRefreshed(opticalSwitch);
} catch (ActionException e) {
e.printStackTrace();
Assert.fail();
}
}
// @Test // uses real connection
public void testRefreshModelExecute() {
log.info("Testing Action with real connection");
try {
ActionResponse response = action.execute(getProtocolSessionManager());
Assert.assertTrue(response.getStatus().equals(STATUS.OK));
for (Response resp : response.getResponses()) {
Assert.assertTrue(resp.getStatus().equals(Status.OK));
}
ProteusOpticalSwitch opticalSwitch = (ProteusOpticalSwitch) action.getModelToUpdate();
checkModelIsRefreshed(opticalSwitch);
} catch (ActionException e) {
e.printStackTrace();
Assert.fail();
} catch (ProtocolException e) {
e.printStackTrace();
Assert.fail();
}
}
public void checkModelIsRefreshed(ProteusOpticalSwitch opticalSwitch) {
Assert.assertTrue(opticalSwitch.getLogicalDevices().size() > 0);
ProteusOpticalSwitchCard dropCard = null;
for (LogicalDevice dev : opticalSwitch.getLogicalDevices()) {
if (dev instanceof ProteusOpticalSwitchCard) {
ProteusOpticalSwitchCard card = (ProteusOpticalSwitchCard) dev;
Assert.assertNotNull(card.getChannelPlan());
Assert.assertTrue(card.getChannelPlan() instanceof WDMChannelPlan);
if (card.getCardType().equals(CardType.ROADM_DROP)) {
dropCard = card;
int chassis = dropCard.getChasis();
int slot = dropCard.getModuleNumber();
Assert.assertTrue(WonesysCommand.toByteHexString(chassis, 1).length() == 2);
Assert.assertTrue(WonesysCommand.toByteHexString(slot, 1).length() == 2);
Assert.assertTrue(dropCard.getChannelPlan().getFirstChannel() >= 0);
Assert.assertTrue(dropCard.getChannelPlan().getLastChannel() > dropCard.getChannelPlan().getFirstChannel());
Assert.assertTrue(dropCard.getChannelPlan().getChannelGap() > 0);
Assert.assertFalse(dropCard.getChannelPlan().getAllChannels().isEmpty());
boolean internalConnectionsDetected = false;
for (NetworkPort port : dropCard.getModulePorts()) {
for (LogicalPort fcport : port.getPortsOnDevice()) {
if (fcport instanceof FCPort) {
Assert.assertTrue(((FCPort) fcport).getPortNumber() >= dropCard.getChannelPlan().getFirstChannel());
Assert.assertTrue(((FCPort) fcport).getPortNumber() <= dropCard.getChannelPlan().getLastChannel());
}
}
// when topology is complete:
// module ports should be connected between each others (same card ports)
internalConnectionsDetected = internalConnectionsDetected || !dropCard.getInternalConnections((FCPort) port)
.isEmpty();
}
Assert.assertTrue(internalConnectionsDetected);
// select SetChannel srcPort
FCPort setSrcPort = ((WonesysDropCard) dropCard).getCommonPort();
// select SetChannel dwdmChannel
List<FiberChannel> freeChannels = dropCard.getFreeChannels(setSrcPort);
int freeChannelsSize = freeChannels.size();
DWDMChannel selectedChannel = (DWDMChannel) freeChannels.get(0);
int dwdmChannel = selectedChannel.getChannelNumber();
// select setChannel dstPort
NetworkPort setDstPort = null;
List<NetworkPort> reachablePorts = dropCard.getInternalConnections(setSrcPort);
// selecting express port will create a passthrough connection
if (reachablePorts.contains(((WonesysDropCard) dropCard).getExpressPort()))
setDstPort = ((WonesysDropCard) dropCard).getExpressPort();
Assert.assertNotNull(setDstPort);
}
}
}
for (FiberConnection connection : opticalSwitch.getFiberConnections()) {
ProteusOpticalSwitchCard modelSrcCard = opticalSwitch.getCard(connection.getSrcCard().getChasis(), connection.getSrcCard().getSlot());
ProteusOpticalSwitchCard modelDstCard = opticalSwitch.getCard(connection.getDstCard().getChasis(), connection.getDstCard().getSlot());
Assert.assertTrue(connection.getSrcCard().equals(modelSrcCard));
Assert.assertTrue(connection.getDstCard().equals(modelDstCard));
Assert.assertTrue(connection.getSrcPort().equals(modelSrcCard.getPort(connection.getSrcPort().getPortNumber())));
Assert.assertTrue(connection.getDstPort().equals(modelDstCard.getPort(connection.getDstPort().getPortNumber())));
Assert.assertTrue(connection.getSrcFiberChannel().equals(
((WDMChannelPlan) modelSrcCard.getChannelPlan()).getChannel(connection.getSrcFiberChannel().getNumChannel())));
Assert.assertTrue(connection.getDstFiberChannel().equals(
((WDMChannelPlan) modelDstCard.getChannelPlan()).getChannel(connection.getDstFiberChannel().getNumChannel())));
// subPorts have been created
WDMFCPort srcSubPort = null;
for (LogicalPort subPort : connection.getSrcPort().getPortsOnDevice()) {
if (subPort instanceof WDMFCPort) {
if (((WDMFCPort) subPort).getDWDMChannel().getLambda() == connection.getSrcFiberChannel().getLambda()) {
srcSubPort = (WDMFCPort) subPort;
break;
}
}
}
Assert.assertNotNull(srcSubPort);
Assert.assertFalse(srcSubPort.getOutgoingDeviceConnections().isEmpty());
WDMFCPort dstSubPort = null;
for (LogicalPort subPort : connection.getDstPort().getPortsOnDevice()) {
if (subPort instanceof WDMFCPort) {
if (((WDMFCPort) subPort).getDWDMChannel().getLambda() == connection.getDstFiberChannel().getLambda()) {
dstSubPort = (WDMFCPort) subPort;
break;
}
}
}
Assert.assertNotNull(dstSubPort);
Assert.assertFalse(dstSubPort.getIncomingDeviceConnections().isEmpty());
// there is a route from srcSubPort to dstSubPort
WDMFCPort subPort = srcSubPort;
int hopCounter = 0;
while (!subPort.equals(dstSubPort) && hopCounter < 10) {
subPort = (WDMFCPort) subPort.getOutgoingDeviceConnections().get(0);
hopCounter++;
}
Assert.assertTrue(subPort.equals(dstSubPort));
}
}
public ProtocolSessionManager getMockProtocolSessionManager() {
ProtocolSessionManager protocolSessionManager = new MockProtocolSessionManager(resourceId);
return protocolSessionManager;
}
public ProtocolSessionManager getProtocolSessionManager() throws ProtocolException {
ProtocolManager protocolManager = new ProtocolManager();
ProtocolSessionManager protocolSessionManager = null;
protocolSessionManager = (ProtocolSessionManager) protocolManager.getProtocolSessionManager(resourceId);
ProtocolSessionContext wonesysContext = newSessionContextWonesys();
protocolManager.sessionFactoryAdded(new WonesysProtocolSessionFactory(), new HashMap<String, String>() {
{
put(ProtocolSessionContext.PROTOCOL, "wonesys");
}
});
protocolSessionManager.registerContext(wonesysContext);
return protocolSessionManager;
}
/**
* Configure the protocol to connect
*/
private ProtocolSessionContext newSessionContextWonesys() {
String hostIpAddress = "10.10.80.11";
String hostPort = "27773";
ProtocolSessionContext protocolSessionContext = new ProtocolSessionContext();
protocolSessionContext.addParameter(ProtocolSessionContext.PROTOCOL,
"wonesys");
protocolSessionContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "wonesys://" + hostIpAddress + ":" + hostPort);
return protocolSessionContext;
}
}