package org.opennaas.itests.roadm.alarms;
import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
import static org.opennaas.itests.helpers.OpennaasExamOptions.includeFeatures;
import static org.opennaas.itests.helpers.OpennaasExamOptions.noConsole;
import static org.opennaas.itests.helpers.OpennaasExamOptions.opennaasDistributionConfiguration;
import static org.ops4j.pax.exam.CoreOptions.options;
import java.util.ArrayList;
import java.util.Date;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import javax.inject.Inject;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennaas.core.events.IEventManager;
import org.opennaas.core.resources.ILifecycle;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceManager;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.core.resources.alarms.IAlarmsRepository;
import org.opennaas.core.resources.alarms.ResourceAlarm;
import org.opennaas.core.resources.capability.ICapabilityFactory;
import org.opennaas.core.resources.descriptor.ResourceDescriptor;
import org.opennaas.core.resources.helpers.ResourceDescriptorFactory;
import org.opennaas.core.resources.protocol.IProtocolManager;
import org.opennaas.core.resources.protocol.IProtocolSession;
import org.opennaas.core.resources.protocol.IProtocolSessionManager;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.protocol.ProtocolSessionContext;
import org.opennaas.extensions.roadm.wonesys.protocols.WonesysProtocolSession;
import org.opennaas.extensions.roadm.wonesys.transports.rawsocket.RawSocketTransport;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.ExamReactorStrategy;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.spi.reactors.EagerSingleStagedReactorFactory;
import org.ops4j.pax.exam.util.Filter;
import org.osgi.framework.BundleContext;
import org.osgi.service.blueprint.container.BlueprintContainer;
import org.osgi.service.event.Event;
@SuppressWarnings("unused")
@RunWith(JUnit4TestRunner.class)
@ExamReactorStrategy(EagerSingleStagedReactorFactory.class)
public class CompleteAlarmsWorkflowTest
{
private static final Log log = LogFactory.getLog(CompleteAlarmsWorkflowTest.class);
@Inject
private BundleContext bundleContext;
private List<Event> receivedEvents = new ArrayList<Event>();
private final Object lock = new Object();
@Inject
private IEventManager eventManager;
@Inject
private IResourceManager resourceManager;
@Inject
private IProtocolManager protocolManager;
@Inject
private IAlarmsRepository alarmsRepo;
@Inject
@Filter("(capability=monitoring)")
private ICapabilityFactory monitoringFactory;
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.roadm.repository)", timeout = 20000)
private BlueprintContainer roadmRepositoryService;
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.roadm.protocols.wonesys)", timeout = 20000)
private BlueprintContainer wonesysProtocolService;
@Configuration
public static Option[] configuration() {
return options(opennaasDistributionConfiguration(),
includeFeatures("opennaas-luminis", "opennaas-roadm-proteus"),
noConsole(),
keepRuntimeFolder());
}
private TestInitInfo setUp() throws ResourceException, ProtocolException {
// clear resource repo
List<IResource> resources = resourceManager.listResources();
for (IResource resource : resources) {
if (resource.getState().equals(ILifecycle.State.ACTIVE))
resourceManager.stopResource(resource.getResourceIdentifier());
resourceManager.removeResource(resource.getResourceIdentifier());
}
IResource resource = resourceManager.createResource(createResourceDescriptorWithMonitoring());
// add SessionContext
IProtocolSessionManager sessionManager = protocolManager.getProtocolSessionManagerWithContext(resource.getResourceIdentifier().getId(),
createWonesysSessionContextMock());
// start resource
resourceManager.startResource(resource.getResourceIdentifier());
// create session
IProtocolSession session = sessionManager.obtainSessionByProtocol("wonesys", false);
String transportId = ((WonesysProtocolSession) session).getWonesysTransport().getTransportID();
alarmsRepo.clear();
TestInitInfo info = new TestInitInfo();
info.resource = resource;
info.sessionManager = sessionManager;
info.session = (WonesysProtocolSession) session;
info.transportId = transportId;
return info;
}
private void tearDown(TestInitInfo initInfo) throws ResourceException, ProtocolException {
resourceManager.stopResource(initInfo.resource.getResourceIdentifier());
resourceManager.removeResource(initInfo.resource.getResourceIdentifier());
alarmsRepo.clear();
}
@Test
public void completeAlarmsWorkflowTest() throws Exception {
TestInitInfo initInfo = setUp();
// ChannelPlan Changed message
String chassis = "00";
String slot = "01";
String alarmMessage = "FFFF0000" + chassis + slot + "01FF80";
generateRawSocketEvent(initInfo.transportId, alarmMessage);
try {
Thread.sleep(20000);
List<ResourceAlarm> alarms = alarmsRepo.getResourceAlarms(initInfo.resource.getResourceIdentifier().getId());
Assert.assertFalse(alarms.isEmpty());
Assert.assertTrue(alarms.size() == 1);
// Check alarm is identified as Channel plan changed alarm
Assert.assertTrue(alarms.get(0).getProperty(ResourceAlarm.ALARM_CODE_PROPERTY).equals("CPLANCHANGED"));
} finally {
tearDown(initInfo);
}
}
private ResourceDescriptor createResourceDescriptorWithMonitoring() {
List<String> capabilities = new ArrayList<String>();
capabilities.add("monitoring");
capabilities.add("queue");
return ResourceDescriptorFactory.newResourceDescriptorProteus("TestProteus", "roadm", capabilities);
}
private ProtocolSessionContext createWonesysSessionContextMock() {
ProtocolSessionContext protocolSessionContext = new ProtocolSessionContext();
protocolSessionContext.addParameter("protocol.mock", "true");
protocolSessionContext.addParameter(ProtocolSessionContext.PROTOCOL, "wonesys");
protocolSessionContext.addParameter(ProtocolSessionContext.AUTH_TYPE,
"password");
return protocolSessionContext;
}
private void generateRawSocketEvent(String transportId, String message) {
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(RawSocketTransport.MESSAGE_PROPERTY_NAME, message);
properties.put(RawSocketTransport.TRANSPORT_ID_PROPERTY_NAME, transportId);
long creationTime = new Date().getTime();
properties.put(RawSocketTransport.ARRIVAL_TIME_PROPERTY_NAME, creationTime);
Event event = new Event(RawSocketTransport.MSG_RCVD_EVENT_TOPIC, properties);
eventManager.publishEvent(event);
log.debug("RawSocketTransport Event generated! " + message + " at " + creationTime);
}
class TestInitInfo {
public WonesysProtocolSession session;
public IProtocolSessionManager sessionManager;
public IResource resource;
public String transportId;
}
}