/opennms-ackd/src/test/java/org/opennms/netmgt/ackd/AckdTest.java

https://github.com/ajakubo1/opennms · Java · 386 lines · 268 code · 70 blank · 48 comment · 1 complexity · 5ba26d1a09b064015df5dbd91a23ae95 MD5 · raw file

  1. /*******************************************************************************
  2. * This file is part of OpenNMS(R).
  3. *
  4. * Copyright (C) 2009-2012 The OpenNMS Group, Inc.
  5. * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc.
  6. *
  7. * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
  8. *
  9. * OpenNMS(R) is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published
  11. * by the Free Software Foundation, either version 3 of the License,
  12. * or (at your option) any later version.
  13. *
  14. * OpenNMS(R) is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with OpenNMS(R). If not, see:
  21. * http://www.gnu.org/licenses/
  22. *
  23. * For more information contact:
  24. * OpenNMS(R) Licensing <license@opennms.org>
  25. * http://www.opennms.org/
  26. * http://www.opennms.com/
  27. *******************************************************************************/
  28. package org.opennms.netmgt.ackd;
  29. import java.util.Date;
  30. import java.util.HashSet;
  31. import java.util.List;
  32. import java.util.Properties;
  33. import java.util.Set;
  34. import org.junit.Assert;
  35. import org.junit.Before;
  36. import org.junit.Test;
  37. import org.junit.runner.RunWith;
  38. import org.opennms.core.spring.BeanUtils;
  39. import org.opennms.core.test.MockLogAppender;
  40. import org.opennms.core.test.OpenNMSJUnit4ClassRunner;
  41. import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase;
  42. import org.opennms.netmgt.EventConstants;
  43. import org.opennms.netmgt.ackd.AckReader.AckReaderState;
  44. import org.opennms.netmgt.config.ackd.Reader;
  45. import org.opennms.netmgt.dao.DatabasePopulator;
  46. import org.opennms.netmgt.dao.api.AcknowledgmentDao;
  47. import org.opennms.netmgt.dao.api.AlarmDao;
  48. import org.opennms.netmgt.dao.api.EventDao;
  49. import org.opennms.netmgt.dao.api.NodeDao;
  50. import org.opennms.netmgt.dao.api.NotificationDao;
  51. import org.opennms.netmgt.dao.api.UserNotificationDao;
  52. import org.opennms.netmgt.model.AckType;
  53. import org.opennms.netmgt.model.OnmsAcknowledgment;
  54. import org.opennms.netmgt.model.OnmsAlarm;
  55. import org.opennms.netmgt.model.OnmsEvent;
  56. import org.opennms.netmgt.model.OnmsNode;
  57. import org.opennms.netmgt.model.OnmsNotification;
  58. import org.opennms.netmgt.model.OnmsSeverity;
  59. import org.opennms.netmgt.model.OnmsUserNotification;
  60. import org.opennms.netmgt.model.events.EventBuilder;
  61. import org.opennms.test.JUnitConfigurationEnvironment;
  62. import org.springframework.beans.factory.InitializingBean;
  63. import org.springframework.beans.factory.annotation.Autowired;
  64. import org.springframework.test.context.ContextConfiguration;
  65. import org.springframework.test.context.transaction.BeforeTransaction;
  66. import org.springframework.transaction.annotation.Transactional;
  67. /**
  68. * Acknowledgment Daemon tests
  69. *
  70. * @author <a href="mailto:david@opennms.org">David Hustace</a>
  71. */
  72. @RunWith(OpenNMSJUnit4ClassRunner.class)
  73. @ContextConfiguration(locations={
  74. "classpath:/META-INF/opennms/applicationContext-soa.xml",
  75. "classpath:/META-INF/opennms/applicationContext-commonConfigs.xml",
  76. "classpath:/META-INF/opennms/applicationContext-dao.xml",
  77. "classpath*:/META-INF/opennms/component-dao.xml",
  78. "classpath:/META-INF/opennms/applicationContext-daemon.xml",
  79. "classpath*:/META-INF/opennms/component-service.xml",
  80. "classpath:/META-INF/opennms/mockEventIpcManager.xml",
  81. "classpath:/META-INF/opennms/applicationContext-setupIpLike-enabled.xml",
  82. "classpath:/META-INF/opennms/applicationContext-ackd.xml",
  83. "classpath:/META-INF/opennms/applicationContext-databasePopulator.xml",
  84. "classpath:/META-INF/opennms/applicationContext-minimal-conf.xml"
  85. })
  86. @JUnitConfigurationEnvironment
  87. @JUnitTemporaryDatabase(dirtiesContext=false)
  88. @Transactional
  89. public class AckdTest implements InitializingBean {
  90. @Autowired
  91. private AlarmDao m_alarmDao;
  92. @Autowired
  93. private EventDao m_eventDao;
  94. @Autowired
  95. private Ackd m_daemon;
  96. @Autowired
  97. private AcknowledgmentDao m_ackDao;
  98. @Autowired
  99. private NodeDao m_nodeDao;
  100. @Autowired
  101. private DatabasePopulator m_populator;
  102. @Autowired
  103. private NotificationDao m_notificationDao;
  104. @Autowired
  105. private UserNotificationDao m_userNotificationDao;
  106. private static boolean m_populated = false;
  107. @BeforeTransaction
  108. public void populateDatabase() {
  109. try {
  110. if (!m_populated) {
  111. m_populator.populateDatabase();
  112. }
  113. } catch (Throwable e) {
  114. e.printStackTrace(System.err);
  115. } finally {
  116. m_populated = true;
  117. }
  118. }
  119. @Before
  120. public void setUp() throws Exception {
  121. Properties props = new Properties();
  122. props.setProperty("log4j.logger.org.hibernate", "INFO");
  123. props.setProperty("log4j.logger.org.springframework", "INFO");
  124. props.setProperty("log4j.logger.org.hibernate.SQL", "DEBUG");
  125. MockLogAppender.setupLogging(props);
  126. }
  127. @Override
  128. public void afterPropertiesSet() throws Exception {
  129. BeanUtils.assertAutowiring(this);
  130. Assert.assertSame("dao from populator should refer to same dao from local properties", m_populator.getAcknowledgmentDao(), m_ackDao);
  131. }
  132. @Test
  133. public void testRestartReaders() throws Exception {
  134. AckReader reader = m_daemon.getAckReaders().get(0);
  135. Reader readerConfig = m_daemon.getConfigDao().getReader("JavaMailReader");
  136. readerConfig.setEnabled(true);
  137. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.STOPPED.equals(reader.getState()));
  138. m_daemon.restartReaders(false);
  139. Thread.sleep(30);
  140. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.STARTED.equals(reader.getState()));
  141. m_daemon.pauseReaders();
  142. Thread.sleep(30);
  143. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.PAUSED.equals(reader.getState()));
  144. m_daemon.resumeReaders();
  145. Thread.sleep(30);
  146. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.RESUMED.equals(reader.getState()));
  147. readerConfig.setEnabled(false);
  148. m_daemon.restartReaders(true);
  149. Thread.sleep(300);
  150. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.STOPPED.equals(reader.getState()));
  151. m_daemon.resumeReaders();
  152. Thread.sleep(30);
  153. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.STOPPED.equals(reader.getState()));
  154. readerConfig.setEnabled(true);
  155. m_daemon.startReaders();
  156. Thread.sleep(300);
  157. Assert.assertTrue("Unexpected reader state: "+reader.getState(), AckReaderState.STARTED.equals(reader.getState()));
  158. m_daemon.destroy();
  159. }
  160. /**
  161. * Make sure the DB is not empty
  162. */
  163. @Test
  164. public void testDbState() {
  165. Assert.assertFalse(m_nodeDao.findAll().isEmpty());
  166. }
  167. /**
  168. * This tests the acknowledgment of an alarm and any related notifications.
  169. */
  170. @Test
  171. public void testAcknowledgeAlarm() {
  172. VerificationObject vo = createAckStructure();
  173. Assert.assertTrue(vo.m_nodeId > 0);
  174. Assert.assertTrue(vo.m_alarmId > 0);
  175. Assert.assertTrue(vo.m_eventID > 0);
  176. Assert.assertTrue(vo.m_userNotifId > 0);
  177. OnmsAlarm alarm = m_alarmDao.get(vo.m_alarmId);
  178. OnmsAcknowledgment ack = new OnmsAcknowledgment(m_alarmDao.get(vo.m_alarmId));
  179. m_ackDao.save(ack);
  180. m_ackDao.flush();
  181. m_ackDao.processAck(ack);
  182. alarm = m_alarmDao.get(ack.getRefId());
  183. Assert.assertNotNull(alarm.getAlarmAckUser());
  184. Assert.assertEquals("admin", alarm.getAlarmAckUser());
  185. OnmsNotification notif = m_notificationDao.get(vo.m_notifId);
  186. Assert.assertNotNull(notif);
  187. Assert.assertEquals("admin", notif.getAnsweredBy());
  188. Assert.assertTrue(alarm.getAlarmAckTime().before(notif.getRespondTime()));
  189. }
  190. /**
  191. * This tests acknowledging a notification and a related alarm. If events are being deduplicated
  192. * they should all have the same alarm ID.
  193. * @throws InterruptedException
  194. */
  195. @Test
  196. public void testAcknowledgeNotification() throws InterruptedException {
  197. VerificationObject vo = createAckStructure();
  198. Assert.assertTrue(vo.m_nodeId > 0);
  199. Assert.assertTrue(vo.m_alarmId > 0);
  200. Assert.assertTrue(vo.m_eventID > 0);
  201. Assert.assertTrue(vo.m_userNotifId > 0);
  202. OnmsAcknowledgment ack = new OnmsAcknowledgment(m_notificationDao.get(vo.m_notifId));
  203. m_ackDao.save(ack);
  204. m_ackDao.flush();
  205. Thread.sleep(1);
  206. m_ackDao.processAck(ack);
  207. OnmsNotification notif = m_notificationDao.get(ack.getRefId());
  208. Assert.assertNotNull(notif.getAnsweredBy());
  209. Assert.assertEquals("admin", notif.getAnsweredBy());
  210. OnmsAlarm alarm = m_alarmDao.get(vo.m_alarmId);
  211. Assert.assertNotNull(alarm);
  212. Assert.assertEquals("admin", alarm.getAlarmAckUser());
  213. long ackTime = ack.getAckTime().getTime();
  214. long respondTime = notif.getRespondTime().getTime();
  215. //the DAOs now set the acknowledgment time for each Acknowledgable and should
  216. //be later (by a few millis in this test) than the time the acknowledgment was created
  217. //this will give us an idea about the processing time of an acknowledgment
  218. Assert.assertTrue(ackTime < respondTime);
  219. }
  220. @Test
  221. public void testHandelEvent() throws InterruptedException {
  222. VerificationObject vo = createAckStructure();
  223. EventBuilder bldr = new EventBuilder(EventConstants.ACKNOWLEDGE_EVENT_UEI, "AckdTest");
  224. bldr.addParam("ackType", String.valueOf(AckType.ALARM));
  225. bldr.addParam("refId", vo.m_alarmId);
  226. final String user = "ackd-test-user";
  227. bldr.addParam("user", user);
  228. m_daemon.handleAckEvent(bldr.getEvent());
  229. OnmsNotification notif = m_notificationDao.get(vo.m_notifId);
  230. Assert.assertEquals(notif.getAckUser(), user);
  231. // Assert.assertEquals(notif.getAckTime(), bldr.getEvent().getTime());
  232. OnmsAlarm alarm = m_alarmDao.get(vo.m_alarmId);
  233. Assert.assertEquals(alarm.getAckUser(), user);
  234. // Assert.assertEquals(alarm.getAckTime(), bldr.getEvent().getTime());
  235. }
  236. class VerificationObject {
  237. int m_eventID;
  238. int m_alarmId;
  239. int m_nodeId;
  240. int m_notifId;
  241. int m_userNotifId;
  242. }
  243. private VerificationObject createAckStructure() {
  244. final Date time = new Date();
  245. VerificationObject vo = new VerificationObject();
  246. List<OnmsNode> nodes = m_nodeDao.findAll();
  247. Assert.assertTrue("List of nodes should not be empty", nodes.size() > 0);
  248. OnmsNode node = m_nodeDao.get(nodes.get(0).getId());
  249. vo.m_nodeId = node.getId();
  250. OnmsEvent event = new OnmsEvent();
  251. event.setDistPoller(node.getDistPoller());
  252. event.setNode(node);
  253. event.setEventCreateTime(time);
  254. event.setEventDescr("Test node down event.");
  255. event.setEventSeverity(6);
  256. event.setEventSource("AckdTest");
  257. event.setEventTime(time);
  258. event.setEventUei(EventConstants.NODE_DOWN_EVENT_UEI);
  259. event.setIpAddr(node.getPrimaryInterface().getIpAddress());
  260. event.setEventLog("Y");
  261. event.setEventDisplay("Y");
  262. event.setEventLogMsg("Testing node down event from AckdTest.");
  263. m_eventDao.save(event);
  264. m_eventDao.flush();
  265. vo.m_eventID = event.getId();
  266. OnmsAlarm alarm = new OnmsAlarm();
  267. alarm.setAlarmType(1);
  268. alarm.setClearKey(EventConstants.NODE_UP_EVENT_UEI + ":localhost:1");
  269. alarm.setCounter(1);
  270. alarm.setDescription(event.getEventDescr());
  271. alarm.setDistPoller(event.getDistPoller());
  272. alarm.setFirstEventTime(event.getEventTime());
  273. alarm.setIpAddr(event.getIpAddr());
  274. alarm.setLastEvent(event);
  275. alarm.setLastEventTime(event.getEventTime());
  276. alarm.setLogMsg("Some Log Message");
  277. alarm.setNode(event.getNode());
  278. alarm.setReductionKey("xyz");
  279. alarm.setServiceType(event.getServiceType());
  280. alarm.setSeverity(OnmsSeverity.get(event.getEventSeverity()));
  281. alarm.setUei(event.getEventUei());
  282. m_alarmDao.save(alarm);
  283. m_alarmDao.flush();
  284. vo.m_alarmId = alarm.getId();
  285. event.setAlarm(alarm);
  286. OnmsNotification notif = new OnmsNotification();
  287. notif.setEvent(event);
  288. notif.setEventUei(event.getEventUei());
  289. notif.setIpAddress(event.getIpAddr());
  290. notif.setNode(event.getNode());
  291. notif.setNotifConfigName("abc");
  292. notif.setNumericMsg(event.getEventLogMsg());
  293. notif.setPageTime(event.getEventTime());
  294. notif.setServiceType(event.getServiceType());
  295. notif.setSubject("notifyid: 1, node down");
  296. notif.setTextMsg(event.getEventLogMsg());
  297. m_notificationDao.save(notif);
  298. vo.m_notifId = notif.getNotifyId();
  299. OnmsUserNotification userNotif = new OnmsUserNotification();
  300. userNotif.setAutoNotify("Y");
  301. userNotif.setContactInfo("me@yourock.com");
  302. userNotif.setMedia("page");
  303. userNotif.setNotification(notif);
  304. userNotif.setNotifyTime(event.getEventTime());
  305. userNotif.setUserId("me");
  306. Set<OnmsUserNotification> usersnotifieds = new HashSet<OnmsUserNotification>();
  307. usersnotifieds.add(userNotif);
  308. m_userNotificationDao.save(userNotif);
  309. vo.m_userNotifId = userNotif.getId();
  310. notif.setUsersNotified(usersnotifieds);
  311. m_notificationDao.update(notif);
  312. m_eventDao.update(event);
  313. m_eventDao.flush();
  314. return vo;
  315. }
  316. }