/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-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.importer; import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.opennms.core.test.OpenNMSJUnit4ClassRunner; import org.opennms.core.test.snmp.annotations.JUnitSnmpAgent; import org.opennms.core.test.snmp.annotations.JUnitSnmpAgents; import org.opennms.core.utils.BeanUtils; import org.opennms.netmgt.config.SnmpPeerFactory; import org.opennms.netmgt.dao.CategoryDao; import org.opennms.netmgt.dao.DatabasePopulator; import org.opennms.netmgt.dao.ServiceTypeDao; import org.opennms.netmgt.dao.SnmpInterfaceDao; import org.opennms.netmgt.dao.db.JUnitConfigurationEnvironment; import org.opennms.netmgt.dao.db.JUnitTemporaryDatabase; import org.opennms.netmgt.importer.config.Asset; import org.opennms.netmgt.importer.config.Category; import org.opennms.netmgt.importer.config.Interface; import org.opennms.netmgt.importer.config.ModelImport; import org.opennms.netmgt.importer.config.MonitoredService; import org.opennms.netmgt.importer.config.Node; import org.opennms.netmgt.importer.specification.ImportVisitor; import org.opennms.netmgt.importer.specification.SpecFile; import org.opennms.netmgt.model.OnmsAssetRecord; import org.opennms.netmgt.model.OnmsCategory; import org.opennms.netmgt.model.OnmsServiceType; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.core.style.ToStringCreator; import org.springframework.test.context.ContextConfiguration; /** * Unit test for ModelImport application. */ @RunWith(OpenNMSJUnit4ClassRunner.class) @ContextConfiguration(locations={ "classpath:/META-INF/opennms/applicationContext-dao.xml", "classpath*:/META-INF/opennms/component-dao.xml", "classpath:/META-INF/opennms/applicationContext-databasePopulator.xml", "classpath:/META-INF/opennms/applicationContext-setupIpLike-enabled.xml", "classpath:/META-INF/opennms/applicationContext-proxy-snmp.xml", "classpath:/modelImporterTest.xml" }) @JUnitConfigurationEnvironment @JUnitTemporaryDatabase @JUnitSnmpAgents({ @JUnitSnmpAgent(host="172.20.1.201", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="192.168.2.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.99.99.99", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.128.2.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.128.7.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.131.177.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.131.180.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.131.182.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.131.185.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.132.80.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.132.78.1", resource="classpath:/snmpTestData1.properties"), @JUnitSnmpAgent(host="10.136.160.1", resource="classpath:/snmpTestData1.properties") }) public class ModelImporterTest implements InitializingBean { @Autowired private DatabasePopulator m_populator; @Autowired private ServiceTypeDao m_serviceTypeDao; @Autowired private CategoryDao m_categoryDao; @Autowired private ModelImporter m_importer; @Autowired private SnmpInterfaceDao m_snmpInterfaceDao; @Autowired private SnmpPeerFactory m_snmpPeerFactory; @Override public void afterPropertiesSet() throws Exception { BeanUtils.assertAutowiring(this); SnmpPeerFactory.setInstance(m_snmpPeerFactory); } class CountingVisitor implements ImportVisitor { private int m_modelImportCount; private int m_modelImportCompleted; private int m_nodeCount; private int m_nodeCompleted; private int m_ifaceCount; private int m_ifaceCompleted; private int m_svcCount; private int m_svcCompleted; private int m_categoryCount; private int m_categoryCompleted; private int m_assetCount; private int m_assetCompleted; public int getModelImportCount() { return m_modelImportCount; } public int getModelImportCompletedCount() { return m_modelImportCompleted; } public int getNodeCount() { return m_nodeCount; } public int getNodeCompletedCount() { return m_nodeCompleted; } public int getInterfaceCount() { return m_ifaceCount; } public int getInterfaceCompletedCount() { return m_ifaceCompleted; } public int getMonitoredServiceCount() { return m_svcCount; } public int getMonitoredServiceCompletedCount() { return m_svcCompleted; } public int getCategoryCount() { return m_categoryCount; } public int getCategoryCompletedCount() { return m_categoryCompleted; } private int getAssetCount() { return m_assetCount; } private int getAssetCompletedCount() { return m_assetCompleted; } public void visitModelImport(ModelImport mi) { m_modelImportCount++; } public void visitNode(Node node) { m_nodeCount++; assertEquals("apknd", node.getNodeLabel()); assertEquals("4243", node.getForeignId()); } public void visitInterface(Interface iface) { m_ifaceCount++; } public void visitMonitoredService(MonitoredService svc) { m_svcCount++; } public void visitCategory(Category category) { m_categoryCount++; } public void visitAsset(Asset asset) { m_assetCount++; } public String toString() { return (new ToStringCreator(this) .append("modelImportCount", getModelImportCount()) .append("modelImportCompletedCount", getModelImportCompletedCount()) .append("nodeCount", getNodeCount()) .append("nodeCompletedCount", getNodeCompletedCount()) .append("interfaceCount", getInterfaceCount()) .append("interfaceCompletedCount", getInterfaceCompletedCount()) .append("monitoredServiceCount", getMonitoredServiceCount()) .append("monitoredServiceCompletedCount", getMonitoredServiceCompletedCount()) .append("categoryCount", getCategoryCount()) .append("categoryCompletedCount", getCategoryCompletedCount()) .append("assetCount", getAssetCount()) .append("assetCompletedCount", getAssetCompletedCount()) .toString()); } public void completeModelImport(ModelImport modelImport) { m_modelImportCompleted++; } public void completeNode(Node node) { m_nodeCompleted++; } public void completeInterface(Interface iface) { m_ifaceCompleted++; } public void completeMonitoredService(MonitoredService svc) { m_svcCompleted++; } public void completeCategory(Category category) { m_categoryCompleted++; } public void completeAsset(Asset asset) { m_assetCompleted++; } } @Test public void testVisit() throws Exception { SpecFile specFile = new SpecFile(); specFile.loadResource(new ClassPathResource("/NewFile2.xml")); CountingVisitor visitor = new CountingVisitor(); specFile.visitImport(visitor); verifyCounts(visitor); } @Test public void testFindQuery() throws Exception { ModelImporter mi = m_importer; String specFile = "/tec_dump.xml.smalltest"; mi.importModelFromResource(new ClassPathResource(specFile)); for (OnmsAssetRecord assetRecord : m_importer.getAssetRecordDao().findAll()) { System.err.println(assetRecord.getAssetNumber()); } } @Test @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database public void testPopulate() throws Exception { createAndFlushServiceTypes(); createAndFlushCategories(); ModelImporter mi = m_importer; String specFile = "/tec_dump.xml.smalltest"; mi.importModelFromResource(new ClassPathResource(specFile)); //Verify distpoller count assertEquals(1, mi.getDistPollerDao().countAll()); //Verify node count assertEquals(10, mi.getNodeDao().countAll()); //Verify ipinterface count assertEquals(30, mi.getIpInterfaceDao().countAll()); //Verify ifservices count assertEquals(50, mi.getMonitoredServiceDao().countAll()); //Verify service count assertEquals(3, mi.getServiceTypeDao().countAll()); } @Test @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database public void testAddSnmpInterfaces() throws Exception { createAndFlushServiceTypes(); createAndFlushCategories(); ModelImporter mi = m_importer; String specFile = "/tec_dump.xml"; mi.importModelFromResource(new ClassPathResource(specFile)); assertEquals(1, mi.getIpInterfaceDao().findByIpAddress("172.20.1.204").size()); assertEquals(2, mi.getIpInterfaceDao().countAll()); assertEquals(6, m_snmpInterfaceDao.countAll()); } /** * This test first bulk imports 10 nodes then runs update with 1 node missing * from the import file. * * @throws ModelImportException */ @Test @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database public void testImportUtf8() throws Exception { createAndFlushServiceTypes(); createAndFlushCategories(); //Initialize the database ModelImporter mi = m_importer; String specFile = "/utf-8.xml"; mi.importModelFromResource(new ClassPathResource(specFile)); assertEquals(1, mi.getNodeDao().countAll()); // \u00f1 is unicode for n~ assertEquals("\u00f1ode2", mi.getNodeDao().get(1).getLabel()); } /** * This test first bulk imports 10 nodes then runs update with 1 node missing * from the import file. * * @throws ModelImportException */ @Test @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database public void testDelete() throws Exception { createAndFlushServiceTypes(); createAndFlushCategories(); //Initialize the database ModelImporter mi = m_importer; String specFile = "/tec_dump.xml.smalltest"; mi.importModelFromResource(new ClassPathResource(specFile)); assertEquals(10, mi.getNodeDao().countAll()); } private static void verifyCounts(CountingVisitor visitor) { System.err.println(visitor); assertEquals(1, visitor.getModelImportCount()); assertEquals(1, visitor.getNodeCount()); assertEquals(3, visitor.getCategoryCount()); assertEquals(4, visitor.getInterfaceCount()); assertEquals(6, visitor.getMonitoredServiceCount()); assertEquals(3, visitor.getAssetCount()); assertEquals(visitor.getModelImportCount(), visitor.getModelImportCompletedCount()); assertEquals(visitor.getNodeCount(), visitor.getNodeCompletedCount()); assertEquals(visitor.getCategoryCount(), visitor.getCategoryCompletedCount()); assertEquals(visitor.getInterfaceCount(), visitor.getInterfaceCompletedCount()); assertEquals(visitor.getMonitoredServiceCount(), visitor.getMonitoredServiceCompletedCount()); assertEquals(visitor.getAssetCount(), visitor.getAssetCompletedCount()); } private void createAndFlushServiceTypes() { m_serviceTypeDao.save(new OnmsServiceType("ICMP")); m_serviceTypeDao.save(new OnmsServiceType("SNMP")); m_serviceTypeDao.save(new OnmsServiceType("HTTP")); m_serviceTypeDao.flush(); } private void createAndFlushCategories() { m_categoryDao.save(new OnmsCategory("AC")); m_categoryDao.save(new OnmsCategory("AP")); m_categoryDao.save(new OnmsCategory("UK")); m_categoryDao.save(new OnmsCategory("BE")); m_categoryDao.save(new OnmsCategory("high")); m_categoryDao.save(new OnmsCategory("low")); m_categoryDao.save(new OnmsCategory("Park Plaza")); m_categoryDao.save(new OnmsCategory("Golden Tulip")); m_categoryDao.save(new OnmsCategory("Hilton")); m_categoryDao.save(new OnmsCategory("Scandic")); m_categoryDao.save(new OnmsCategory("Best Western")); m_categoryDao.flush(); } }