/*******************************************************************************
* 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.collectd;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.opennms.core.utils.InetAddressUtils.addr;
import java.io.File;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import org.opennms.core.test.MockLogAppender;
import org.opennms.netmgt.config.CollectdConfigFactory;
import org.opennms.netmgt.config.CollectdPackage;
import org.opennms.netmgt.config.PollOutagesConfigFactory;
import org.opennms.netmgt.config.ThresholdingConfigFactory;
import org.opennms.netmgt.config.collectd.Collector;
import org.opennms.netmgt.config.collectd.Filter;
import org.opennms.netmgt.config.collectd.Package;
import org.opennms.netmgt.config.collectd.Parameter;
import org.opennms.netmgt.config.collectd.Service;
import org.opennms.netmgt.config.collector.CollectionSet;
import org.opennms.netmgt.config.collector.CollectionSetVisitor;
import org.opennms.netmgt.config.collector.ServiceParameters;
import org.opennms.netmgt.dao.CollectorConfigDao;
import org.opennms.netmgt.dao.FilterDao;
import org.opennms.netmgt.dao.IpInterfaceDao;
import org.opennms.netmgt.dao.NodeDao;
import org.opennms.netmgt.eventd.EventIpcManager;
import org.opennms.netmgt.eventd.EventIpcManagerFactory;
import org.opennms.netmgt.filter.FilterDaoFactory;
import org.opennms.netmgt.model.OnmsIpInterface;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.model.RrdRepository;
import org.opennms.netmgt.model.events.EventListener;
import org.opennms.netmgt.model.events.EventProxy;
import org.opennms.netmgt.poller.mock.MockScheduler;
import org.opennms.netmgt.scheduler.ReadyRunnable;
import org.opennms.netmgt.scheduler.Scheduler;
import org.opennms.test.ConfigurationTestUtils;
import org.opennms.test.mock.EasyMockUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.SimpleTransactionStatus;
import org.springframework.transaction.support.TransactionTemplate;
public class CollectdTest extends TestCase {
EasyMockUtils m_easyMockUtils = new EasyMockUtils();
private Collectd m_collectd;
private FilterDao m_filterDao;
private EventIpcManager m_eventIpcManager;
private CollectorConfigDao m_collectorConfigDao;
private NodeDao m_nodeDao;
private IpInterfaceDao m_ipIfDao;
private ServiceCollector m_collector;
private MockScheduler m_scheduler;
private PlatformTransactionManager m_transactionManager;
private CollectdPackage m_collectdPackage;
@Override
protected void setUp() throws Exception {
MockLogAppender.setupLogging();
Resource threshdResource = new ClassPathResource("/etc/thresholds.xml");
File homeDir = threshdResource.getFile().getParentFile().getParentFile();
System.setProperty("opennms.home", homeDir.getAbsolutePath());
// Test setup
m_eventIpcManager = m_easyMockUtils.createMock(EventIpcManager.class);
EventIpcManagerFactory.setIpcManager(m_eventIpcManager);
m_collectorConfigDao = m_easyMockUtils.createMock(CollectorConfigDao.class);
m_nodeDao = m_easyMockUtils.createMock(NodeDao.class);
m_ipIfDao = m_easyMockUtils.createMock(IpInterfaceDao.class);
m_collector = m_easyMockUtils.createMock(ServiceCollector.class);
m_scheduler = new MockScheduler();
m_eventIpcManager.addEventListener(isA(EventListener.class));
expectLastCall().anyTimes();
m_eventIpcManager.addEventListener(isA(EventListener.class), isACollection(String.class));
expectLastCall().anyTimes();
m_eventIpcManager.addEventListener(isA(EventListener.class), isA(String.class));
expectLastCall().anyTimes();
m_eventIpcManager.removeEventListener(isA(EventListener.class));
expectLastCall().anyTimes();
// MockNetwork m_network = new MockNetwork();
// m_network.setCriticalService("ICMP");
// m_network.addNode(1, "Router");
// m_network.addInterface("192.168.1.1");
// m_network.addService("ICMP");
// m_network.addService("SMTP");
// m_network.addInterface("192.168.1.2");
// m_network.addService("ICMP");
// m_network.addService("SMTP");
// m_network.addNode(2, "Server");
// m_network.addInterface("192.168.1.3");
// m_network.addService("ICMP");
// m_network.addService("HTTP");
// m_network.addNode(3, "Firewall");
// m_network.addInterface("192.168.1.4");
// m_network.addService("SMTP");
// m_network.addService("HTTP");
// m_network.addInterface("192.168.1.5");
// m_network.addService("SMTP");
// m_network.addService("HTTP");
//
// MockDatabase m_db = new MockDatabase();
// m_db.populate(m_network);
//
// DataSourceFactory.setInstance(m_db);
m_filterDao = EasyMock.createMock(FilterDao.class);
List<InetAddress> allIps = new ArrayList<InetAddress>();
allIps.add(addr("192.168.1.1"));
allIps.add(addr("192.168.1.2"));
allIps.add(addr("192.168.1.3"));
allIps.add(addr("192.168.1.4"));
allIps.add(addr("192.168.1.5"));
expect(m_filterDao.getActiveIPAddressList("IPADDR IPLIKE *.*.*.*")).andReturn(allIps).atLeastOnce();
expect(m_filterDao.getActiveIPAddressList("IPADDR IPLIKE 1.1.1.1")).andReturn(new ArrayList<InetAddress>(0)).atLeastOnce();
EasyMock.replay(m_filterDao);
FilterDaoFactory.setInstance(m_filterDao);
// This call will also ensure that the poll-outages.xml file can parse IPv4
// and IPv6 addresses.
Resource resource = new ClassPathResource("etc/poll-outages.xml");
PollOutagesConfigFactory factory = new PollOutagesConfigFactory(resource);
factory.afterPropertiesSet();
PollOutagesConfigFactory.setInstance(factory);
CollectdConfigFactory collectdConfig = new CollectdConfigFactory(ConfigurationTestUtils.getInputStreamForResource(this, "/org/opennms/netmgt/config/collectd-testdata.xml"), "nms1", false);
CollectdConfigFactory.setInstance(collectdConfig);
m_collectd = new Collectd();
m_collectd.setEventIpcManager(getEventIpcManager());
m_collectd.setCollectorConfigDao(getCollectorConfigDao());
m_collectd.setNodeDao(getNodeDao());
m_collectd.setIpInterfaceDao(getIpInterfaceDao());
m_collectd.setScheduler(m_scheduler);
Package pkg = new Package();
pkg.setName("pkg");
Filter filter = new Filter();
filter.setContent("IPADDR IPLIKE *.*.*.*");
pkg.setFilter(filter);
Service svc = new Service();
pkg.addService(svc);
svc.setName("SNMP");
svc.setStatus("on");
Parameter parm = new Parameter();
parm.setKey("collection");
parm.setValue("default");
svc.addParameter(parm);
parm = new Parameter();
parm.setKey("thresholding-enabled");
parm.setValue("true");
svc.addParameter(parm);
svc.setStatus("on");
m_collectdPackage = new CollectdPackage(pkg, "localhost", false);
ThresholdingConfigFactory.setInstance(new ThresholdingConfigFactory(ConfigurationTestUtils.getInputStreamForConfigFile("thresholds.xml")));
}
@Override
public void runTest() throws Throwable {
super.runTest();
// FIXME: we get a Threshd warning still if we enable this :(
// MockLogAppender.assertNoWarningsOrGreater();
EasyMock.verify(m_filterDao);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
private ServiceCollector getCollector() {
return m_collector;
}
private NodeDao getNodeDao() {
return m_nodeDao;
}
private IpInterfaceDao getIpInterfaceDao() {
return m_ipIfDao;
}
private CollectorConfigDao getCollectorConfigDao() {
return m_collectorConfigDao;
}
private EventIpcManager getEventIpcManager() {
return m_eventIpcManager;
}
private OnmsIpInterface getInterface() {
OnmsNode node = new OnmsNode();
node.setId(1);
OnmsIpInterface iface = new OnmsIpInterface("192.168.1.1", node);
iface.setId(1);
return iface;
}
public void testCreate() throws CollectionInitializationException {
setupTransactionManager();
String svcName = "SNMP";
setupCollector(svcName);
setupTransactionManager();
Scheduler m_scheduler = m_easyMockUtils.createMock(Scheduler.class);
m_collectd.setScheduler(m_scheduler);
m_scheduler.schedule(eq(0L), isA(ReadyRunnable.class));
m_scheduler.start();
m_scheduler.stop();
m_easyMockUtils.replayAll();
m_collectd.init();
m_collectd.start();
m_collectd.stop();
m_easyMockUtils.verifyAll();
}
/**
* Test override of read community string and max repetitions in Collectd configuration parameters
*/
public void testOverrides() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("max-repetitions", "11");
map.put("read-community", "notPublic");
ServiceParameters params = new ServiceParameters(map);
int reps = params.getSnmpMaxRepetitions(6);
assertEquals("Overriding max repetitions failed.", 11, reps);
params = new ServiceParameters(map);
map.remove("max-repetitions");
map.put("maxRepetitions", "11");
assertEquals("Overriding max repetitions failed.", 11, reps);
String s = params.getSnmpReadCommunity("public");
assertEquals("Overriding read community failed.", "notPublic", s);
map.remove("read-community");
map.put("readCommunity", "notPublic");
params = new ServiceParameters(map);
s = params.getSnmpReadCommunity("public");
assertEquals("Overriding read community failed.", "notPublic", s);
}
public void testNoMatchingSpecs() throws CollectionInitializationException {
String svcName = "SNMP";
setupCollector(svcName);
expect(m_ipIfDao.findByServiceType(svcName)).andReturn(new ArrayList<OnmsIpInterface>(0));
setupTransactionManager();
m_easyMockUtils.replayAll();
m_collectd.init();
m_collectd.start();
m_scheduler.next();
assertEquals(0, m_scheduler.getEntryCount());
m_collectd.stop();
m_easyMockUtils.verifyAll();
}
public void testOneMatchingSpec() throws CollectionException, CollectionInitializationException {
String svcName = "SNMP";
OnmsIpInterface iface = getInterface();
setupCollector(svcName);
m_collector.initialize(isA(CollectionAgent.class), isAMap(String.class, Object.class));
CollectionSet collectionSetResult=new CollectionSet() {
private Date m_timestamp = new Date();
public int getStatus() {
return ServiceCollector.COLLECTION_SUCCEEDED;
}
public void visit(CollectionSetVisitor visitor) {
visitor.visitCollectionSet(this);
visitor.completeCollectionSet(this);
}
public boolean ignorePersist() {
return false;
}
public Date getCollectionTimestamp() {
return m_timestamp;
}
};
expect(m_collector.collect(isA(CollectionAgent.class), isA(EventProxy.class), isAMap(String.class, Object.class))).andReturn(collectionSetResult);
setupInterface(iface);
setupTransactionManager();
expect(m_collectorConfigDao.getPackages()).andReturn(Collections.singleton(m_collectdPackage));
m_easyMockUtils.replayAll();
m_collectd.init();
m_collectd.start();
m_scheduler.next();
assertEquals("scheduler entry count", 1, m_scheduler.getEntryCount());
m_scheduler.next();
m_collectd.stop();
m_easyMockUtils.verifyAll();
}
@SuppressWarnings("unchecked")
private <K> Collection<K> isACollection(Class<K> innerClass) {
return isA(Collection.class);
}
/*
@SuppressWarnings("unchecked")
private <K> List<K> isAList(Class<K> innerClass) {
return isA(List.class);
}
*/
@SuppressWarnings("unchecked")
private static <K, V> Map<K, V> isAMap(Class<K> keyClass, Class<V> valueClass) {
return isA(Map.class);
}
private void setupTransactionManager() {
m_transactionManager = m_easyMockUtils.createMock(PlatformTransactionManager.class);
TransactionTemplate transactionTemplate = new TransactionTemplate(m_transactionManager);
m_collectd.setTransactionTemplate(transactionTemplate);
expect(m_transactionManager.getTransaction(isA(TransactionDefinition.class))).andReturn(new SimpleTransactionStatus()).anyTimes();
m_transactionManager.rollback(isA(TransactionStatus.class));
expectLastCall().anyTimes();
m_transactionManager.commit(isA(TransactionStatus.class)); //anyTimes();
expectLastCall().anyTimes();
}
private void setupInterface(OnmsIpInterface iface) {
expect(m_ipIfDao.findByServiceType("SNMP")).andReturn(Collections.singletonList(iface));
expect(m_ipIfDao.load(iface.getId())).andReturn(iface).atLeastOnce();
}
private void setupCollector(String svcName) throws CollectionInitializationException {
Collector collector = new Collector();
collector.setService(svcName);
collector.setClassName(MockServiceCollector.class.getName());
MockServiceCollector.setDelegate(getCollector());
EasyMockUtils m_mockUtils = new EasyMockUtils();
m_collectd.setNodeDao(m_mockUtils.createMock(NodeDao.class));
// Setup expectation
Map<String,String> empty = Collections.emptyMap();
m_collector.initialize(empty);
expect(m_collectorConfigDao.getCollectors()).andReturn(Collections.singleton(collector));
}
public static class MockServiceCollector implements ServiceCollector {
private static ServiceCollector s_delegate;
public MockServiceCollector() {
}
public static void setDelegate(ServiceCollector delegate) {
s_delegate = delegate;
}
public CollectionSet collect(CollectionAgent agent, EventProxy eproxy, Map<String, Object> parameters) throws CollectionException {
return s_delegate.collect(agent, eproxy, parameters);
}
public void initialize(Map<String, String> parameters) throws CollectionInitializationException {
s_delegate.initialize(parameters);
}
public void initialize(CollectionAgent agent, Map<String, Object> parameters) throws CollectionInitializationException {
s_delegate.initialize(agent, parameters);
}
public void release() {
s_delegate.release();
}
public void release(CollectionAgent agent) {
s_delegate.release(agent);
}
public RrdRepository getRrdRepository(String collectionName) {
RrdRepository repo = new RrdRepository();
ArrayList<String> rras=new ArrayList<String>();
rras.add("RRA:AVERAGE:0.5:1:8928");
repo.setRrdBaseDir(new File("/usr/local/opennms/share/rrd/snmp/"));
repo.setRraList(rras);
repo.setStep(300);
repo.setHeartBeat(2 * 300);
return repo;
}
}
}