/*******************************************************************************
* 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.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennms.netmgt.dao.DataLinkInterfaceDao;
import org.opennms.netmgt.dao.DatabasePopulator;
import org.opennms.netmgt.dao.IpInterfaceDao;
import org.opennms.netmgt.dao.LinkStateDao;
import org.opennms.netmgt.dao.MonitoredServiceDao;
import org.opennms.netmgt.dao.NodeDao;
import org.opennms.netmgt.dao.ServiceTypeDao;
import org.opennms.netmgt.dao.db.JUnitConfigurationEnvironment;
import org.opennms.netmgt.dao.db.JUnitTemporaryDatabase;
import org.opennms.core.test.OpenNMSJUnit4ClassRunner;
import org.opennms.core.utils.BeanUtils;
import org.opennms.netmgt.model.DataLinkInterface;
import org.opennms.netmgt.model.OnmsIpInterface;
import org.opennms.netmgt.model.OnmsLinkState;
import org.opennms.netmgt.model.OnmsMonitoredService;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.OnmsServiceType;
import org.opennms.netmgt.model.OnmsLinkState.LinkState;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
@RunWith(OpenNMSJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"classpath:/META-INF/opennms/applicationContext-dao.xml",
"classpath*:/META-INF/opennms/component-dao.xml",
"classpath:/META-INF/opennms/applicationContext-daemon.xml",
"classpath:/META-INF/opennms/mockEventIpcManager.xml",
"classpath:/META-INF/opennms/applicationContext-databasePopulator.xml",
"classpath:/META-INF/opennms/provisiond-extensions.xml",
"classpath:/testConfigContext.xml"
})
@JUnitConfigurationEnvironment
@JUnitTemporaryDatabase
public class DefaultNodeLinkServiceTest implements InitializingBean {
private int END_POINT1_ID;
private int END_POINT2_ID;
private int END_POINT3_ID;
private String END_POINT1_LABEL = "node1";
// private String END_POINT2_LABEL = "node2";
// private String END_POINT3_LABEL = "node3";
public String NO_SUCH_NODE_LABEL = "noSuchNode";
@Autowired
DatabasePopulator m_dbPopulator;
@Autowired
NodeDao m_nodeDao;
@Autowired
IpInterfaceDao m_ipInterfaceDao;
@Autowired
LinkStateDao m_linkStateDao;
@Autowired
DataLinkInterfaceDao m_dataLinkDao;
@Autowired
MonitoredServiceDao m_monitoredServiceDao;
@Autowired
JdbcTemplate m_jdbcTemplate;
@Autowired
NodeLinkService m_nodeLinkService;
@Autowired
ServiceTypeDao m_serviceTypeDao;
@Autowired
TransactionTemplate m_transactionTemplate;
@Before
public void setup(){
m_dbPopulator.populateDatabase();
END_POINT1_ID = m_dbPopulator.getNode1().getId();
END_POINT1_LABEL = m_dbPopulator.getNode1().getLabel();
END_POINT2_ID = m_dbPopulator.getNode2().getId();
END_POINT3_ID = m_dbPopulator.getNode3().getId();
}
@Override
public void afterPropertiesSet() throws Exception {
BeanUtils.assertAutowiring(this);
}
@Test
@Transactional
public void dwoTestGetNodeLabel(){
String nodeLabel = m_nodeLinkService.getNodeLabel(END_POINT1_ID);
assertNotNull(nodeLabel);
assertEquals("node1", nodeLabel);
}
@Test
@Transactional
public void dwoTestNodeNotThere(){
String nodeLabel = m_nodeLinkService.getNodeLabel(200);
assertNull(nodeLabel);
}
@Test
@Transactional
public void dwoTestGetNodeId(){
Integer nodeId = m_nodeLinkService.getNodeId(END_POINT1_LABEL);
assertNotNull(nodeId);
assertEquals(END_POINT1_ID, nodeId.intValue());
}
@Test
@Transactional
public void dwoTestGetNodeIdNull(){
Integer nodeId = m_nodeLinkService.getNodeId(NO_SUCH_NODE_LABEL);
assertNull(nodeId);
}
@Test
@Transactional
public void dwoTestCreateLink(){
Collection<DataLinkInterface> dataLinks = m_dataLinkDao.findByNodeId(END_POINT3_ID);
assertEquals(0, dataLinks.size());
m_nodeLinkService.createLink(END_POINT1_ID, END_POINT3_ID);
dataLinks = m_dataLinkDao.findByNodeId(END_POINT3_ID);
assertEquals(1, dataLinks.size());
}
@Test
@Transactional
public void dwoTestLinkAlreadyExists(){
Collection<DataLinkInterface> dataLinks = m_dataLinkDao.findByNodeId(END_POINT2_ID);
assertEquals(1, dataLinks.size());
m_nodeLinkService.createLink(END_POINT1_ID, END_POINT2_ID);
dataLinks = m_dataLinkDao.findByNodeId(END_POINT2_ID);
assertEquals(1, dataLinks.size());
}
@Test
@Transactional
public void dwoTestUpdateLinkStatus(){
Collection<DataLinkInterface> dataLinks = m_dataLinkDao.findByNodeId(END_POINT2_ID);
assertEquals("A", dataLinks.iterator().next().getStatus());
int parentNodeId = END_POINT1_ID;
int nodeId = END_POINT2_ID;
m_nodeLinkService.updateLinkStatus(parentNodeId, nodeId, "G");
dataLinks = m_dataLinkDao.findByNodeId(END_POINT2_ID);
assertEquals("G", dataLinks.iterator().next().getStatus());
}
@Test
@Transactional
public void dwoTestUpdateLinkFailedStatus(){
int parentNodeId = END_POINT1_ID;
int nodeId = END_POINT2_ID;
Collection<DataLinkInterface> dataLinks = m_dataLinkDao.findByNodeId(nodeId);
assertEquals("A", dataLinks.iterator().next().getStatus());
m_nodeLinkService.updateLinkStatus(parentNodeId, nodeId, "B");
dataLinks = m_dataLinkDao.findByNodeId(nodeId);
assertEquals("B", dataLinks.iterator().next().getStatus());
}
@Test
@Transactional
public void dwoTestUpdateLinkGoodThenFailedStatus(){
int parentNodeId = END_POINT1_ID;
int nodeId = END_POINT2_ID;
Collection<DataLinkInterface> dataLinks = m_dataLinkDao.findByNodeId(nodeId);
assertEquals("A", dataLinks.iterator().next().getStatus());
m_nodeLinkService.updateLinkStatus(parentNodeId, nodeId, "G");
dataLinks = m_dataLinkDao.findByNodeId(nodeId);
assertEquals("G", dataLinks.iterator().next().getStatus());
m_nodeLinkService.updateLinkStatus(parentNodeId, nodeId, "B");
dataLinks = m_dataLinkDao.findByNodeId(nodeId);
assertEquals("B", dataLinks.iterator().next().getStatus());
}
@Test
@Transactional
public void dwoTestGetLinkContainingNodeId() {
int parentNodeId = END_POINT1_ID;
Collection<DataLinkInterface> datalinks = m_nodeLinkService.getLinkContainingNodeId(parentNodeId);
assertEquals(3, datalinks.size());
}
@Test
@Transactional
public void dwoTestGetLinkStateForInterface() {
int nodeId = END_POINT2_ID;
Collection<DataLinkInterface> dlis = m_nodeLinkService.getLinkContainingNodeId(nodeId);
DataLinkInterface dli = dlis.iterator().next();
assertNotNull(dli);
OnmsLinkState linkState = new OnmsLinkState();
linkState.setDataLinkInterface(dli);
m_linkStateDao.save(linkState);
m_linkStateDao.flush();
linkState = m_nodeLinkService.getLinkStateForInterface(dli);
assertNotNull("linkState was null", linkState);
assertEquals(OnmsLinkState.LinkState.LINK_UP, linkState.getLinkState());
}
@Test
@Transactional
public void dwoTestSaveLinkState() {
int nodeId = END_POINT2_ID;
Collection<DataLinkInterface> dlis = m_nodeLinkService.getLinkContainingNodeId(nodeId);
DataLinkInterface dli = dlis.iterator().next();
OnmsLinkState linkState = new OnmsLinkState();
linkState.setDataLinkInterface(dli);
m_linkStateDao.save(linkState);
m_linkStateDao.flush();
OnmsLinkState linkState2 = m_nodeLinkService.getLinkStateForInterface(dli);
assertNotNull("linkState was null", linkState2);
assertEquals(OnmsLinkState.LinkState.LINK_UP, linkState2.getLinkState());
linkState2.setLinkState(OnmsLinkState.LinkState.LINK_NODE_DOWN);
m_nodeLinkService.saveLinkState(linkState2);
OnmsLinkState linkState3 = m_nodeLinkService.getLinkStateForInterface(dli);
assertEquals(OnmsLinkState.LinkState.LINK_NODE_DOWN, linkState3.getLinkState());
}
@Test
@Transactional
public void dwoTestSaveAllEnumStates() {
int nodeId = END_POINT2_ID;
Collection<DataLinkInterface> dlis = m_nodeLinkService.getLinkContainingNodeId(nodeId);
DataLinkInterface dli = dlis.iterator().next();
OnmsLinkState linkState = new OnmsLinkState();
linkState.setDataLinkInterface(dli);
for(LinkState ls : LinkState.values()){
linkState.setLinkState(ls);
saveLinkState(linkState);
}
}
@Test
@Transactional
public void dwoTestAddPrimaryServiceToNode(){
final String END_POINT_SERVICE_NAME = "EndPoint";
addPrimaryServiceToNode(END_POINT1_ID, END_POINT_SERVICE_NAME);
OnmsMonitoredService service = m_monitoredServiceDao.getPrimaryService(END_POINT1_ID, "ICMP");
assertNotNull(service);
assertEquals("ICMP", service.getServiceName());
service = m_monitoredServiceDao.getPrimaryService(END_POINT1_ID, END_POINT_SERVICE_NAME);
assertNotNull(service);
assertEquals(END_POINT_SERVICE_NAME,service.getServiceName());
}
@Test
@Transactional
public void dwoTestNodeHasEndPointService() {
assertFalse(m_nodeLinkService.nodeHasEndPointService(END_POINT1_ID));
final String END_POINT_SERVICE_NAME = "EndPoint";
addPrimaryServiceToNode(END_POINT1_ID, END_POINT_SERVICE_NAME);
assertTrue(m_nodeLinkService.nodeHasEndPointService(END_POINT1_ID));
}
public void addPrimaryServiceToNode(final int nodeId, final String serviceName){
m_transactionTemplate.execute(new TransactionCallback<Object>() {
public Object doInTransaction(TransactionStatus status) {
OnmsServiceType svcType = m_serviceTypeDao.findByName(serviceName);
if(svcType == null){
svcType = new OnmsServiceType(serviceName);
m_serviceTypeDao.save(svcType);
m_serviceTypeDao.flush();
}
OnmsNode node = m_nodeDao.get(nodeId);
OnmsIpInterface ipInterface = node.getPrimaryInterface();
OnmsMonitoredService svc = new OnmsMonitoredService();
svc.setIpInterface(ipInterface);
svc.setServiceType(svcType);
m_monitoredServiceDao.save(svc);
m_monitoredServiceDao.flush();
return null;
}
});
}
public void saveLinkState(final OnmsLinkState linkState){
m_transactionTemplate.execute(new TransactionCallback<Object>() {
public Object doInTransaction(final TransactionStatus status) {
m_linkStateDao.saveOrUpdate(linkState);
m_linkStateDao.flush();
return null;
}
});
}
}