/** {@inheritDoc} */ public File getResourceDir(RrdRepository repository) { // if we are a collection resource for scalars, // return what our super class would return if (nodeTypeName.equalsIgnoreCase("node")) { return new File(repository.getRrdBaseDir(), Integer.toString(agent.getNodeId())); } // we are a collection resource for tabular data // return essentially share/rrd/snmp/NodeId/resourceType/instance // for now; the problem with using key/instance is that // it can change for some tables (e.g. proc table) // whoever instantiates this object is responsible for // passing in an instance that will be unique; // if we want a specific instance of a table, we will use // the instance/key that was used for the query; if not, // we will use the key returned per table row File instDir, rtDir; File rrdBaseDir = repository.getRrdBaseDir(); File nodeDir = new File(rrdBaseDir, String.valueOf(agent.getNodeId())); // if we have a resourceType, put instances under it if (resourceType != null) { rtDir = new File(nodeDir, resourceType); instDir = new File(rtDir, instance); } else { instDir = new File(nodeDir, instance); } return instDir; }
/** * Sets the up. * * @throws Exception the exception */ @Before public void setUp() throws Exception { FileUtils.deleteDirectory(new File(TEST_SNMP_DIRECTORY)); MockLogAppender.setupLogging(); System.setProperty("org.opennms.rrd.usetcp", "false"); System.setProperty("org.opennms.rrd.usequeue", "false"); RrdUtils.setStrategy(new JRobinRrdStrategy()); m_collectionAgent = EasyMock.createMock(CollectionAgent.class); EasyMock.expect(m_collectionAgent.getNodeId()).andReturn(1).anyTimes(); EasyMock.expect(m_collectionAgent.getHostAddress()).andReturn("127.0.0.1").anyTimes(); EasyMock.expect(m_collectionAgent.getStorageDir()).andReturn(new File("1")).anyTimes(); m_eventProxy = EasyMock.createMock(EventProxy.class); m_xmlCollectionDao = new XmlDataCollectionConfigDaoJaxb(); Resource resource = new FileSystemResource(getXmlConfigFileName()); m_xmlCollectionDao.setConfigResource(resource); m_xmlCollectionDao.afterPropertiesSet(); MockDocumentBuilder.setXmlFileName(getXmlSampleFileName()); EasyMock.replay(m_collectionAgent, m_eventProxy); }
public String getParent() { return Integer.toString(agent.getNodeId()); }
/* (non-Javadoc) * @see org.opennms.protocols.xml.collector.XmlCollectionHandler#collect(org.opennms.netmgt.collectd.CollectionAgent, org.opennms.protocols.xml.config.XmlDataCollection, java.util.Map) */ @Override public XmlCollectionSet collect( CollectionAgent agent, XmlDataCollection collection, Map<String, Object> parameters) throws CollectionException { // Create a new collection set. XmlCollectionSet collectionSet = new XmlCollectionSet(agent); collectionSet.setCollectionTimestamp(new Date()); collectionSet.setStatus(ServiceCollector.COLLECTION_UNKNOWN); // TODO We could be careful when handling exceptions because parsing exceptions will be treated // different from connection or retrieval exceptions try { File resourceDir = new File(getRrdRepository().getRrdBaseDir(), Integer.toString(agent.getNodeId())); for (XmlSource source : collection.getXmlSources()) { if (!source.getUrl().startsWith(Sftp3gppUrlHandler.PROTOCOL)) { throw new CollectionException( "The 3GPP SFTP Collection Handler can only use the protocol " + Sftp3gppUrlHandler.PROTOCOL); } String urlStr = parseUrl(source.getUrl(), agent, collection.getXmlRrd().getStep()); URL url = UrlFactory.getUrl(urlStr); String lastFile = getLastFilename(resourceDir, url.getPath()); Sftp3gppUrlConnection connection = (Sftp3gppUrlConnection) url.openConnection(); if (lastFile == null) { lastFile = connection.get3gppFileName(); log() .debug( "collect(single): retrieving file from " + url.getPath() + File.separatorChar + lastFile + " from " + agent.getHostAddress()); Document doc = getXmlDocument(urlStr); fillCollectionSet(agent, collectionSet, source, doc); setLastFilename(resourceDir, url.getPath(), lastFile); deleteFile(connection, lastFile); } else { connection.connect(); List<String> files = connection.getFileList(); long lastTs = connection.getTimeStampFromFile(lastFile); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); factory.setIgnoringComments(true); boolean collected = false; for (String fileName : files) { if (connection.getTimeStampFromFile(fileName) > lastTs) { log() .debug( "collect(multiple): retrieving file " + fileName + " from " + agent.getHostAddress()); InputStream is = connection.getFile(fileName); Document doc = builder.parse(is); IOUtils.closeQuietly(is); fillCollectionSet(agent, collectionSet, source, doc); setLastFilename(resourceDir, url.getPath(), fileName); deleteFile(connection, fileName); collected = true; } } if (!collected) { log().warn("collect: could not find any file after " + lastFile + " on " + agent); } connection.disconnect(); } } collectionSet.setStatus(ServiceCollector.COLLECTION_SUCCEEDED); return collectionSet; } catch (Exception e) { collectionSet.setStatus(ServiceCollector.COLLECTION_FAILED); throw new CollectionException(e.getMessage(), e); } }