/*******************************************************************************
* 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.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Properties;
import org.joda.time.Duration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennms.core.concurrent.PausibleScheduledThreadPoolExecutor;
import org.opennms.core.test.MockLogAppender;
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.core.utils.InetAddressUtils;
import org.opennms.core.utils.LogUtils;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.SnmpPeerFactory;
import org.opennms.netmgt.dao.NodeDao;
import org.opennms.netmgt.dao.db.JUnitConfigurationEnvironment;
import org.opennms.netmgt.dao.db.JUnitTemporaryDatabase;
import org.opennms.netmgt.dao.support.ProxySnmpAgentConfigFactory;
import org.opennms.netmgt.mock.EventAnticipator;
import org.opennms.netmgt.mock.MockEventIpcManager;
import org.opennms.netmgt.model.OnmsIpInterface;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.provision.detector.icmp.IcmpDetector;
import org.opennms.netmgt.provision.detector.snmp.SnmpDetector;
import org.opennms.netmgt.provision.persist.ForeignSourceRepository;
import org.opennms.netmgt.provision.persist.MockForeignSourceRepository;
import org.opennms.netmgt.provision.persist.foreignsource.ForeignSource;
import org.opennms.netmgt.provision.persist.foreignsource.PluginConfig;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ResourceLoader;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.annotation.Transactional;
/**
* Unit test for ModelImport application.
*/
@RunWith(OpenNMSJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"classpath:/META-INF/opennms/applicationContext-soa.xml",
"classpath:/META-INF/opennms/applicationContext-dao.xml",
"classpath:/META-INF/opennms/applicationContext-daemon.xml",
"classpath:/META-INF/opennms/applicationContext-proxy-snmp.xml",
"classpath:/META-INF/opennms/mockEventIpcManager.xml",
"classpath:/META-INF/opennms/applicationContext-setupIpLike-enabled.xml",
"classpath:/META-INF/opennms/applicationContext-provisiond.xml",
"classpath*:/META-INF/opennms/component-dao.xml",
"classpath*:/META-INF/opennms/provisiond-extensions.xml",
"classpath*:/META-INF/opennms/detectors.xml",
"classpath:/META-INF/opennms/applicationContext-databasePopulator.xml",
"classpath:/importerServiceTest.xml"
})
@JUnitConfigurationEnvironment
@JUnitTemporaryDatabase
@DirtiesContext
public class ProvisionerRescanTest implements InitializingBean {
@Autowired
private MockEventIpcManager m_mockEventIpcManager;
@Autowired
private Provisioner m_provisioner;
@Autowired
private NodeDao m_nodeDao;
@Autowired
private ResourceLoader m_resourceLoader;
@Autowired
private ProvisionService m_provisionService;
@Autowired
private PausibleScheduledThreadPoolExecutor m_pausibleExecutor;
@Autowired
private SnmpPeerFactory m_snmpPeerFactory;
private EventAnticipator m_eventAnticipator;
private ForeignSourceRepository m_foreignSourceRepository;
private ForeignSource m_foreignSource;
@Override
public void afterPropertiesSet() throws Exception {
BeanUtils.assertAutowiring(this);
}
@Before
public void setUp() throws Exception {
MockLogAppender.setupLogging(true, "ERROR");
SnmpPeerFactory.setInstance(m_snmpPeerFactory);
assertTrue(m_snmpPeerFactory instanceof ProxySnmpAgentConfigFactory);
// ensure this property is unset for tests and set it only in tests that need it
System.getProperties().remove("org.opennms.provisiond.enableDeletionOfRequisitionedEntities");
m_eventAnticipator = m_mockEventIpcManager.getEventAnticipator();
//((TransactionAwareEventForwarder)m_provisioner.getEventForwarder()).setEventForwarder(m_mockEventIpcManager);
m_provisioner.start();
m_foreignSource = new ForeignSource();
m_foreignSource.setName("noRescanOnImport");
m_foreignSource.setScanInterval(Duration.standardDays(1));
final PluginConfig icmpDetector = new PluginConfig("ICMP", IcmpDetector.class.getName());
icmpDetector.addParameter("timeout", "500");
icmpDetector.addParameter("retries", "0");
m_foreignSource.addDetector(icmpDetector);
final PluginConfig snmpDetector = new PluginConfig("SNMP", SnmpDetector.class.getName());
snmpDetector.addParameter("timeout", "500");
snmpDetector.addParameter("retries", "0");
m_foreignSource.addDetector(snmpDetector);
m_foreignSourceRepository = new MockForeignSourceRepository();
m_foreignSourceRepository.save(m_foreignSource);
m_provisionService.setForeignSourceRepository(m_foreignSourceRepository);
m_pausibleExecutor.pause();
}
@After
public void tearDown() {
// remove property set during tests
System.getProperties().remove("org.opennms.provisiond.enableDeletionOfRequisitionedEntities");
}
private void setupLogging(final String logLevel) {
final Properties config = new Properties();
config.setProperty("log4j.logger.org.hibernate", "ERROR");
config.setProperty("log4j.logger.org.springframework", "ERROR");
config.setProperty("log4j.logger.org.hibernate.SQL", "ERROR");
MockLogAppender.setupLogging(true, logLevel, config);
}
// fail if we take more than five minutes
@Test(timeout=300000)
@Transactional
@JUnitSnmpAgents({
@JUnitSnmpAgent(host="172.20.1.201", port=161, resource="classpath:testNoRescanOnImport-part1.properties"),
@JUnitSnmpAgent(host="172.20.1.204", port=161, resource="classpath:testNoRescanOnImport-part1.properties"),
@JUnitSnmpAgent(host="10.1.15.245", port=161, resource="classpath:testNoRescanOnImport-part2.properties")
})
public void testNoRescanOnImport() throws Exception {
setupLogging("INFO");
System.err.println("-------------------------------------------------------------------------");
System.err.println("Import Part 1");
System.err.println("-------------------------------------------------------------------------");
importFromResource("classpath:/testNoRescanOnImport-part1.xml", true);
final List<OnmsNode> nodes = getNodeDao().findAll();
assertEquals(1, nodes.size());
final OnmsNode node = nodes.get(0);
assertEquals(1, node.getIpInterfaces().size());
System.err.println("-------------------------------------------------------------------------");
System.err.println("Import Part 2");
System.err.println("-------------------------------------------------------------------------");
setupLogging("DEBUG");
m_eventAnticipator.reset();
anticipateNoRescanSecondNodeEvents();
importFromResource("classpath:/testNoRescanOnImport-part2.xml", false);
m_eventAnticipator.verifyAnticipated();
setupLogging("INFO");
//Verify node count
assertEquals(2, getNodeDao().countAll());
for (final OnmsNode n : getNodeDao().findAll()) {
LogUtils.infof(this, "found node %s", n);
for (final OnmsIpInterface iface : n.getIpInterfaces()) {
LogUtils.infof(this, " interface: %s", iface);
}
}
setupLogging("ERROR");
}
private void anticipateNoRescanSecondNodeEvents() {
final String name = this.getClass().getSimpleName();
EventBuilder builder = new EventBuilder(EventConstants.NODE_ADDED_EVENT_UEI, name);
builder.setNodeid(2);
m_eventAnticipator.anticipateEvent(builder.getEvent());
builder = new EventBuilder(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI, name);
builder.setNodeid(2);
builder.setInterface(InetAddressUtils.addr("10.1.15.245"));
m_eventAnticipator.anticipateEvent(builder.getEvent());
for (final String service : new String[] { "ICMP", "SNMP" }) {
builder = new EventBuilder(EventConstants.NODE_GAINED_SERVICE_EVENT_UEI, name);
builder.setNodeid(2);
builder.setInterface(InetAddressUtils.addr("10.1.15.245"));
builder.setService(service);
m_eventAnticipator.anticipateEvent(builder.getEvent());
}
}
private void importFromResource(final String path, final Boolean rescanExisting) throws Exception {
m_provisioner.importModelFromResource(m_resourceLoader.getResource(path), rescanExisting);
}
private NodeDao getNodeDao() {
return m_nodeDao;
}
}