/* @(#)TestTmcdb.java $Revision: 1.5 $ $Date: 2011/05/13 17:40:40 $
*
* ALMA - Atacama Large Millimiter Array (c) European Southern Observatory,
* 2007
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package alma.acs.tmcdb;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.logging.Logger;
import junit.framework.TestCase;
import org.hibernate.LockMode;
import org.hibernate.jdbc.Work;
import alma.acs.logging.level.AcsLogLevelDefinition;
import com.cosylab.cdb.jdal.hibernate.HibernateUtil;
import com.cosylab.cdb.jdal.hibernate.HibernateUtil.HibernateUtilException;
import com.cosylab.cdb.jdal.logging.AcsLoggerHelper;
/** TestTmcdb class tests TMCDB for SNMP. It creates a NodeTree, fills the
* TMCDB, and finally creates a new NodeTree based on the TMCDB content.
*
* @version $Id: TestSnmpTables.java,v 1.5 2011/05/13 17:40:40 rtobar Exp $
* @author P.Grosbol, ESO, <pgrosbol@eso.org>
*/
public class TestSnmpTables extends TestCase {
private final String CREATE_TMCDB_SWCORE = System.getenv("ACSDATA") + "/config/DDL/hsqldb/TMCDB_swconfigcore/CreateHsqldbTables.sql";
private final String CREATE_TMCDB_SWEXT = System.getenv("ACSDATA") + "/config/DDL/hsqldb/TMCDB_swconfigext/CreateHsqldbTables.sql";
private final String DROP_TMCDB_SWCORE = System.getenv("ACSDATA") + "/config/DDL/hsqldb/TMCDB_swconfigcore/DropAllTables.sql";
private final String DROP_TMCDB_SWEXT = System.getenv("ACSDATA") + "/config/DDL/hsqldb/TMCDB_swconfigext/DropAllTables.sql";
private final static int DEFAULT_BUF_LEN = 64 * 1024;
private HibernateUtil hibernateUtil;
private Logger logger = Logger.getLogger("SnmpTmcdb");
protected void setUp() throws Exception {
System.out.println("\n---------------- " + getName() + " ---------------\n");
String loggerName = getName(); // name of junit test
AcsLoggerHelper acsLoggerHelper = AcsLoggerHelper.getInstance();
acsLoggerHelper.setLoggerName(loggerName);
acsLoggerHelper.setDefaultLogLevels(AcsLogLevelDefinition.INFO, AcsLogLevelDefinition.INFO);
logger = AcsLoggerHelper.getInstance().getSharedLogger();
logger.info("Example test log");
acsLoggerHelper.setHibernateLogLevels(AcsLogLevelDefinition.INFO, AcsLogLevelDefinition.WARNING);
acsLoggerHelper.setHibernateSqlLogLevels(AcsLogLevelDefinition.TRACE, AcsLogLevelDefinition.TRACE);
hibernateUtil = HibernateUtil.getInstance(logger);
org.hibernate.cfg.Configuration ac = new org.hibernate.cfg.
Configuration();
ac.configure("test-hibernate.cfg.xml");
hibernateUtil.setConfiguration(ac);
hibernateUtil.getSessionFactory().openSession();
}
@SuppressWarnings("unchecked")
public void testFillSnmpTmcdb() throws Exception {
createDB();
try {
Configuration config = new Configuration();
config.setActive(true);
config.setConfigurationName("pg_Config");
config.setCreationTime(new Date());
config.setFullName("Testing configuration");
config.setDescription("Configuration used for testing SNMP");
Computer comp1 = new Computer();
comp1.setName("osf.comp-1");
comp1.setNetworkName("pc014692.hq.eso.org");
comp1.setPhysicalLocation("Alma building");
comp1.setRealTime(false);
comp1.setDiskless(false);
comp1.setProcessorType(ComputerProcessorType.SMP);
comp1.setConfiguration(config);
Computer comp2 = new Computer();
comp2.setName("osf.comp-2");
comp2.setNetworkName("pc008506.hq.eso.org");
comp2.setPhysicalLocation("Alma building");
comp2.setRealTime(false);
comp2.setDiskless(false);
comp2.setProcessorType(ComputerProcessorType.UNI);
comp2.setConfiguration(config);
/* setup a SNMP trap sink */
SnmpTrapSink sink = new SnmpTrapSink();
sink.setComputer(comp1);
sink.setTrapPort(new Integer(10162));
sink.setTrapSourcesNetworkMask("0.0.0.0");
sink.setSnmpTrapCommunity("public");
sink.setConfiguration(config);
/* setup a powerstrip with 3 sockets */
NetworkPowerstrip strip1 = new NetworkPowerstrip();
strip1.setName("osf.pdu1");
strip1.setNetworkName("pdu1.hq.eso.org");
strip1.setPhysicalLocation("Alma building");
strip1.setConfiguration(config);
PowerstripSocket socket1 = new PowerstripSocket();
socket1.setNetworkPowerstrip(strip1);
socket1.setNetworkDevice(comp1);
socket1.setSocketNumber(new Integer(1));
socket1.setSocketName("comp-1");
PowerstripSocket socket2 = new PowerstripSocket();
socket2.setNetworkPowerstrip(strip1);
socket2.setNetworkDevice(comp1);
socket2.setSocketNumber(new Integer(2));
socket2.setSocketName("comp-1");
PowerstripSocket socket3 = new PowerstripSocket();
socket3.setNetworkPowerstrip(strip1);
socket3.setNetworkDevice(comp2);
socket3.setSocketNumber(new Integer(3));
socket3.setSocketName("comp-2");
HashSet<PowerstripSocket> pss = new HashSet<PowerstripSocket>();
pss.add(socket1);
pss.add(socket2);
pss.add(socket3);
//strip1.setPowerstripSockets(pss);
HashSet<NetworkDevice> nds = new HashSet<NetworkDevice>();
nds.add(comp1);
nds.add(comp2);
nds.add(strip1);
//config.setNetworkDevices(nds);
/* setup a SNMP configuration for computers */
NetworkDeviceSnmpConfig snmp1 = new NetworkDeviceSnmpConfig();
snmp1.setPropagateNA(false);
snmp1.setSnmpCommunity("public");
snmp1.setAcsAlarm(NetDevSnmpConfigAcsAlarm.NEVER);
snmp1.setNetworkDevice(comp1);
String xml1 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
+"<netnode name=\"ps014692\" xmlns=\"Alma/Exec/SnmpConfig\">\n"
+"<uptime />\n"
+"<cpuload type=\"2\" max=\"10\" />\n"
+"<memory min=\"10\" />\n"
+"<diskspace>\n"
+" <disk name=\"/home\" max=\"90\" />\n"
+" <disk name=\"/\" max=\"90\" />\n"
+" <file name=\"/var/log/messages\" max=\"100000000\" />\n"
+" </diskspace>\n"
+" <services>\n"
+" <proc name=\"maciContainer\" min=\"0\" max=\"1\" />\n"
+" </services>\n"
+" <scripts>\n"
+" <exec name=\"/usr/bin/uptime\" />\n"
+" <exec name=\"/sbin/reboot\" />\n"
+" <exec name=\"/home/pgrosbol/bin/snmpexec.sh\" />\n"
+" </scripts>\n"
+" <netports>\n"
+"<port name=\"udp/0.0.0.0:161\" />\n"
+" <port name=\"udp/0.0.0.0:10162\" />\n"
+" </netports>\n"
+" <interfaces>\n"
+" <interface name=\"eth0\" />\n"
+" </interfaces>\n"
+" </netnode>\n";
snmp1.setSnmpXmlClob(xml1);
NetworkDeviceSnmpConfig snmp2 = new NetworkDeviceSnmpConfig();
snmp2.setPropagateNA(true);
snmp2.setSnmpCommunity("public");
snmp2.setAcsAlarm(NetDevSnmpConfigAcsAlarm.ALWAYS);
snmp2.setNetworkDevice(comp2);
String xml2 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
+"<netnode name=\"pc008506\" xmlns=\"Alma/Exec/SnmpConfig\">\n"
+"<uptime />\n"
+"<cpuload type=\"2\" max=\"10\" />\n"
+"<memory min=\"10\" />\n"
+"<diskspace>\n"
+" <disk name=\"/home\" max=\"90\" />\n"
+" <disk name=\"/\" max=\"90\" />\n"
+" <file name=\"/var/log/messages\" max=\"100000000\" />\n"
+" </diskspace>\n"
+" <services>\n"
+" <proc name=\"maciContainer\" min=\"0\" max=\"1\" />\n"
+" </services>\n"
+" <scripts>\n"
+" <exec name=\"/usr/bin/uptime\" />\n"
+" <exec name=\"/sbin/reboot\" />\n"
+" <exec name=\"/home/pgrosbol/bin/snmpexec.sh\" />\n"
+" </scripts>\n"
+" <netports>\n"
+"<port name=\"udp/0.0.0.0:161\" />\n"
+" <port name=\"udp/0.0.0.0:10162\" />\n"
+" </netports>\n"
+" <interfaces>\n"
+" <interface name=\"eth0\" />\n"
+" </interfaces>\n"
+" </netnode>\n";
snmp2.setSnmpXmlClob(xml2);
/* store data in TMCDB */
hibernateUtil.beginTransaction();
hibernateUtil.getSession().save(config);
hibernateUtil.getSession().save(comp1);
hibernateUtil.getSession().save(comp2);
hibernateUtil.getSession().save(snmp1);
hibernateUtil.getSession().save(snmp2);
hibernateUtil.getSession().save(sink);
hibernateUtil.getSession().save(strip1);
hibernateUtil.getSession().save(socket1);
hibernateUtil.getSession().save(socket2);
hibernateUtil.getSession().save(socket3);
hibernateUtil.commitTransaction();
assertEquals( 1 , hibernateUtil.getList(Configuration.class).size());
assertEquals( 1 , hibernateUtil.getList(NetworkPowerstrip.class).size());
assertEquals( 1 , hibernateUtil.getList(SnmpTrapSink.class).size());
assertEquals( 3 , hibernateUtil.getList(PowerstripSocket.class).size());
assertEquals( 2 , hibernateUtil.getList(Computer.class).size());
assertEquals( 2 , hibernateUtil.getList(NetworkDeviceSnmpConfig.class).size());
hibernateUtil.closeSession();
hibernateUtil.beginTransaction();
List<PowerstripSocket> sockets = hibernateUtil.getList(PowerstripSocket.class);
hibernateUtil.getSession().lock(strip1, LockMode.NONE);
for (PowerstripSocket powerstripSocket : sockets) {
hibernateUtil.getSession().lock(powerstripSocket, LockMode.NONE);
assertEquals( powerstripSocket.getSocketName().equals("comp-1") ? comp1.getName() : comp2.getName(), powerstripSocket.getNetworkDevice().getName() );
assertEquals( strip1.getName(), powerstripSocket.getNetworkPowerstrip().getName() );
}
hibernateUtil.closeSession();
} finally {
dropDB();
}
}
private void createDB() throws HibernateUtilException {
String url = hibernateUtil.getConfiguration().getProperty("hibernate.connection.url");
if( url.contains("oracle") ) {
return;
}
hibernateUtil.beginTransaction();
hibernateUtil.getSession().doWork( new Work() {
public void execute(Connection conn) throws SQLException {
conn.setAutoCommit(true);
runScriptFile(CREATE_TMCDB_SWCORE, conn);
runScriptFile(CREATE_TMCDB_SWEXT, conn);
}
});
hibernateUtil.commitTransaction();
}
private void dropDB() throws HibernateUtilException {
String url = hibernateUtil.getConfiguration().getProperty("hibernate.connection.url");
if( !url.contains("mem") ) {
hibernateUtil.beginTransaction();
hibernateUtil.getSession().doWork( new Work() {
public void execute(Connection conn) throws SQLException {
conn.setAutoCommit(true);
runScript("delete from event;" +
"delete from eventchannel;" +
"delete from baciproperty;" +
"delete from snmptrapsink;" +
"delete from powerstripsocket;" +
"delete from networkpowerstrip;" +
"delete from networkdevicesnmpconfig;" +
"delete from component;" +
"delete from componenttype;" +
"delete from namedloggerconfig;" +
"delete from loggingconfig;" +
"delete from eventchannel;" +
"delete from computer;" +
"delete from networkdevice;" +
"delete from configuration",
conn);
}
});
hibernateUtil.commitTransaction();
return;
}
hibernateUtil.beginTransaction();
hibernateUtil.getSession().doWork( new Work() {
public void execute(Connection conn) throws SQLException {
conn.setAutoCommit(true);
runScriptFile(DROP_TMCDB_SWEXT, conn);
runScriptFile(DROP_TMCDB_SWCORE, conn);
}
});
hibernateUtil.commitTransaction();
}
private void runScriptFile( String script, Connection conn )
throws SQLException {
String sql = "";
try {
// try to get hold of the script
InputStream is = getResourceStream(script);
sql = fileToString(new InputStreamReader(is));
} catch (IOException e) {
// convert to runtime, as this is only used for testing
throw new RuntimeException(e);
}
runScript(sql, conn);
}
private void runScript( String sql, Connection conn )
throws SQLException {
Statement stmt = conn.createStatement();
String[] statements = sql.split( ";", -1 );
for( int i = 0; i < statements.length; i++ ) {
String statement = statements[i].trim();
if( statement.length() == 0 ) {
// skip empty lines
continue;
}
stmt.execute( statement );
}
}
private InputStream getResourceStream(String pathname)
throws IOException {
InputStream s = null; // this is the stream we return
// Look for the resource on the file system
// -----------------------------------------
File f = new File( pathname );
s = new FileInputStream( f );
return s;
}
private String fileToString( Reader reader ) throws IOException {
BufferedReader br = new BufferedReader( reader );
StringBuffer sb = new StringBuffer();
char[] buff = new char[DEFAULT_BUF_LEN];
while( br.ready() ) {
int nread = br.read( buff, 0, buff.length );
if( nread <= 0 ) {
break;
}
sb.append( buff, 0, nread );
}
br.close();
return sb.toString();
}
}