/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.provision.adapters.link;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.opennms.core.test.MockLogAppender;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.mock.EventAnticipator;
import org.opennms.netmgt.mock.MockEventIpcManager;
import org.opennms.netmgt.mock.MockNetwork;
import org.opennms.netmgt.mock.MockNode;
import org.opennms.netmgt.model.DataLinkInterface;
import org.opennms.netmgt.model.OnmsDistPoller;
import org.opennms.netmgt.model.OnmsLinkState;
import org.opennms.netmgt.model.OnmsLinkState.LinkState;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.provision.adapters.link.endpoint.dao.DefaultEndPointConfigurationDao;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.netmgt.xml.event.Parm;
import org.opennms.test.mock.EasyMockUtils;
import org.springframework.core.io.ClassPathResource;
public class LinkEventCorrelatorTest {
private Event m_unmanagedEvent = new EventBuilder(EventConstants.DATA_LINK_UNMANAGED_EVENT_UEI, "Test").getEvent();
private Event m_failedEvent = new EventBuilder(EventConstants.DATA_LINK_FAILED_EVENT_UEI, "Test").getEvent();
private Event m_regainedEvent = new EventBuilder(EventConstants.DATA_LINK_RESTORED_EVENT_UEI, "Test").getEvent();
EasyMockUtils m_easyMock = new EasyMockUtils();
// MockEventUtil m_eventUtil = new MockEventUtil();
private MockNetwork m_network;
private MockNode m_node1;
private MockNode m_node2;
private MockEventIpcManager m_eventIpcManager;
private EventAnticipator m_anticipator;
private NodeLinkService m_nodeLinkService;
private DataLinkInterface m_dataLinkInterface;
private DefaultEndPointConfigurationDao m_endPointConfigDao;
@Before
public void setUp() {
MockLogAppender.setupLogging();
m_eventIpcManager = new MockEventIpcManager();
m_anticipator = m_eventIpcManager.getEventAnticipator();
m_endPointConfigDao = new DefaultEndPointConfigurationDao();
m_endPointConfigDao.setConfigResource(new ClassPathResource("/test-endpoint-configuration.xml"));
m_endPointConfigDao.afterPropertiesSet();
m_network = new MockNetwork();
m_node1 = new MockNode(m_network, 1, "pittsboro-1");
m_node1.addInterface("192.168.0.1").addService("EndPoint", 1);
m_node2 = new MockNode(m_network, 2, "pittsboro-2");
m_node2.addInterface("192.168.0.2").addService("EndPoint", 1);
m_nodeLinkService = createMock(NodeLinkService.class);
final OnmsNode node = new OnmsNode(new OnmsDistPoller("localhost", "127.0.0.1"), "pittsboro-2");
node.setId(2);
final Collection<DataLinkInterface> dlis = new ArrayList<DataLinkInterface>();
m_dataLinkInterface = new DataLinkInterface(node, 1, 1, 1, "U", new Date());
dlis.add(m_dataLinkInterface);
expect(m_nodeLinkService.getLinkContainingNodeId(1)).andStubReturn(dlis);
expect(m_nodeLinkService.getLinkContainingNodeId(2)).andStubReturn(dlis);
expect(m_nodeLinkService.getNodeLabel(1)).andStubReturn("pittsboro-1");
expect(m_nodeLinkService.getNodeLabel(2)).andStubReturn("pittsboro-2");
}
@Test
public void testNodeDownEvent() {
OnmsLinkState ls = new OnmsLinkState( m_dataLinkInterface, LinkState.LINK_UP);
expect(m_nodeLinkService.getLinkStateForInterface(m_dataLinkInterface)).andStubReturn(ls);
expect(m_nodeLinkService.nodeHasEndPointService(1)).andReturn(true);
Event e = m_node1.createDownEvent();
e.setService("EndPoint");
LinkEventCorrelator correlator = new LinkEventCorrelator();
correlator.setEventForwarder(m_eventIpcManager);
correlator.setNodeLinkService(m_nodeLinkService);
correlator.setEndPointConfigDao(m_endPointConfigDao);
m_anticipator.anticipateEvent(m_failedEvent);
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_PARENT_NODE_DOWN));
replay();
correlator.handleNodeDown(e);
//verify that the event was successful
m_eventIpcManager.finishProcessingEvents();
m_anticipator.verifyAnticipated();
verify();
}
@Test
public void testCorrelator1NodeDown() {
OnmsLinkState ls = new OnmsLinkState( m_dataLinkInterface, LinkState.LINK_UP);
expect(m_nodeLinkService.getLinkStateForInterface(m_dataLinkInterface)).andStubReturn(ls);
expect(m_nodeLinkService.nodeHasEndPointService(1)).andReturn(true);
Event e = m_node1.createDownEvent();
e.setService("EndPoint");
LinkEventCorrelator correlator = new LinkEventCorrelator();
correlator.setEventForwarder(m_eventIpcManager);
correlator.setNodeLinkService(m_nodeLinkService);
correlator.setEndPointConfigDao(m_endPointConfigDao);
m_anticipator.anticipateEvent(m_failedEvent);
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_PARENT_NODE_DOWN));
replay();
correlator.handleNodeDown(e);
m_eventIpcManager.finishProcessingEvents();
m_anticipator.verifyAnticipated();
List<Parm> parms = m_anticipator.getAnticipatedEventsRecieved().get(0).getParmCollection();
assertEquals(2, parms.size());
int foundGood = 0;
for (Parm p : parms) {
if (p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT1) || p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT2)) {
if ("pittsboro-1".equals(p.getValue().getContent()) || "pittsboro-2".equals(p.getValue().getContent())) {
foundGood++;
}
}
}
assertEquals("expect 2 endpoint parms", 2, foundGood);
verify();
}
@Test
public void testCorrelatorNodeFlap() {
OnmsLinkState ls = new OnmsLinkState( m_dataLinkInterface, LinkState.LINK_UP);
expect(m_nodeLinkService.getLinkStateForInterface(m_dataLinkInterface)).andStubReturn(ls);
expect(m_nodeLinkService.nodeHasEndPointService(1)).andStubReturn(true);
expect(m_nodeLinkService.nodeHasEndPointService(2)).andStubReturn(true);
LinkEventCorrelator correlator = new LinkEventCorrelator();
correlator.setEventForwarder(m_eventIpcManager);
correlator.setNodeLinkService(m_nodeLinkService);
correlator.setEndPointConfigDao(m_endPointConfigDao);
expect(m_nodeLinkService.getPrimaryAddress(1)).andStubReturn("192.168.0.1");
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_PARENT_NODE_DOWN));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_PARENT_NODE_DOWN));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_BOTH_DOWN));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_NODE_DOWN));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_NODE_DOWN));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_UP));
replay();
m_anticipator.anticipateEvent(m_failedEvent);
m_anticipator.anticipateEvent(m_regainedEvent);
correlator.handleInterfaceDown(m_node1.getInterface("192.168.0.1").createDownEvent());
correlator.handleNodeDown(m_node1.createDownEvent());
correlator.handleNodeDown(m_node2.createDownEvent());
correlator.handleInterfaceUp(m_node1.getInterface("192.168.0.1").createUpEvent());
correlator.handleNodeUp(m_node1.createUpEvent());
correlator.handleNodeUp(m_node2.createUpEvent());
m_eventIpcManager.finishProcessingEvents();
m_anticipator.verifyAnticipated();
List<Parm> parms = m_anticipator.getAnticipatedEventsRecieved().get(0).getParmCollection();
assertEquals(2, parms.size());
int foundGood = 0;
for (Parm p : parms) {
if (p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT1) || p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT2)) {
if ("pittsboro-1".equals(p.getValue().getContent()) || "pittsboro-2".equals(p.getValue().getContent())) {
foundGood++;
}
}
}
assertEquals("expect 2 endpoint parms", 2, foundGood);
verify();
}
@Test
public void testCorrelatorUnmanagedNodeFlap() {
OnmsLinkState ls = new OnmsLinkState( m_dataLinkInterface, LinkState.LINK_BOTH_UNMANAGED);
expect(m_nodeLinkService.getLinkStateForInterface(m_dataLinkInterface)).andStubReturn(ls);
LinkEventCorrelator correlator = new LinkEventCorrelator();
correlator.setEventForwarder(m_eventIpcManager);
correlator.setNodeLinkService(m_nodeLinkService);
correlator.setEndPointConfigDao(m_endPointConfigDao);
expect(m_nodeLinkService.getPrimaryAddress(1)).andStubReturn("192.168.0.1");
expect(m_nodeLinkService.getPrimaryAddress(2)).andStubReturn("192.168.0.2");
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_NODE_UNMANAGED));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_UP));
m_nodeLinkService.saveLinkState(new OnmsLinkState(m_dataLinkInterface, LinkState.LINK_PARENT_NODE_UNMANAGED));
replay();
m_anticipator.anticipateEvent(m_regainedEvent);
m_anticipator.anticipateEvent(m_unmanagedEvent);
correlator.handleNodeGainedService(m_node1.getInterface("192.168.0.1").getService("EndPoint").createNewEvent());
correlator.handleNodeGainedService(m_node2.getInterface("192.168.0.2").getService("EndPoint").createNewEvent());
correlator.handleServiceDeleted(m_node1.getInterface("192.168.0.1").getService("EndPoint").createDeleteEvent());
m_eventIpcManager.finishProcessingEvents();
m_anticipator.verifyAnticipated();
List<Parm> parms = m_anticipator.getAnticipatedEventsRecieved().get(0).getParmCollection();
assertEquals(2, parms.size());
int foundGood = 0;
for (Parm p : parms) {
if (p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT1) || p.getParmName().contentEquals(EventConstants.PARM_ENDPOINT2)) {
if ("pittsboro-1".equals(p.getValue().getContent()) || "pittsboro-2".equals(p.getValue().getContent())) {
foundGood++;
}
}
}
assertEquals("expect 2 endpoint parms", 2, foundGood);
verify();
}
public <T> T createMock(Class<T> clazz){
return m_easyMock.createMock(clazz);
}
public void verify(){
m_easyMock.verifyAll();
}
public void replay(){
m_easyMock.replayAll();
}
}