/* * RHQ Management Platform * Copyright (C) 2005-2014 Red Hat, Inc. * All rights reserved. * * This program 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 version 2 of the License. * * This program 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 this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.enterprise.server.test; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.ejb.Timeout; import javax.ejb.TimerConfig; import javax.ejb.TimerService; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.cloud.StorageNode; import org.rhq.enterprise.server.RHQConstants; import org.rhq.enterprise.server.cloud.instance.ServerManagerLocal; /** * This startup singleton EJB is here to work around bug AS7-5530 and to * schedule the real StartupBean's work in a delayed fashion (this is to allow * AS7 to complete its deployment work before we do our work). * * See https://issues.jboss.org/browse/AS7-5530 * * This version is a replacement for the original code (identical) code that uses the StrippedDownStartupBean instead * of the fullblown original. */ @Singleton @Startup public class StrippedDownStartupBeanPreparation { private static final Log LOG = LogFactory.getLog(StrippedDownStartupBeanPreparation.class); @EJB private StrippedDownStartupBean startupBean; @EJB private ServerManagerLocal serverManager; @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) private EntityManager entityManager; @Resource private TimerService timerService; // needed to schedule our startup bean init call @PostConstruct public void initWithTransactionBecauseAS75530() throws RuntimeException { startupBean.createStorageNodeVersionColumnIfNeeded(); startupBean.createServerVersionColumnIfNeeded(); LOG.info("Scheduling the initialization of the testing RHQ deployment"); timerService.createSingleActionTimer(1, new TimerConfig(null, false)); // call StartupBean in 1ms startupBean.purgeTestServerAndStorageNodes(); createTestServer(); loadCassandraConnectionProps(); createStorageNodes(); } /** * The storage client initialization performed by {@link org.rhq.enterprise.server.storage.StorageClientManager#init()} * requires having a server entity in the database which will be the case with a regular deployment. This method * persists a server before any tests execute. If the server entity does not exist or cannot be loaded, then the * storage client will not initialize properly and any tests that depend on the storage client will fail. */ private void createTestServer() { Server server = new Server(); server.setName(TestConstants.RHQ_TEST_SERVER_NAME); server.setAddress("127.0.0.1"); server.setOperationMode(Server.OperationMode.INSTALLED); server.setPort(7080); server.setSecurePort(7443); server.setVersion(StrippedDownStartupBean.RHQ_VERSION); serverManager.create(server); System.setProperty(TestConstants.RHQ_SERVER_NAME_PROPERTY, TestConstants.RHQ_TEST_SERVER_NAME); } private void createStorageNodes() { String[] nodes = System.getProperty("rhq.storage.nodes").split(","); String cqlPort = System.getProperty("rhq.storage.cql-port"); for (String node : nodes) { StorageNode storageNode = new StorageNode(); storageNode.setAddress(node); storageNode.setCqlPort(Integer.parseInt(cqlPort)); storageNode.setOperationMode(StorageNode.OperationMode.NORMAL); storageNode.setVersion(StrippedDownStartupBean.RHQ_VERSION); entityManager.persist(storageNode); } } public void loadCassandraConnectionProps() { InputStream stream; try { stream = getClass().getResourceAsStream("/cassandra-test.properties"); Properties props = new Properties(); props.load(stream); // DO NOT use System.setProperties(Properties). I previously tried that and it // caused some arquillian deployment exception. // // jsanda System.setProperty("rhq.storage.username", props.getProperty("rhq.storage.username")); System.setProperty("rhq.storage.password", props.getProperty("rhq.storage.password")); System.setProperty("rhq.storage.nodes", props.getProperty("rhq.storage.nodes")); System.setProperty("rhq.storage.cql-port", props.getProperty("rhq.storage.cql-port")); System.setProperty("rhq.storage.gossip-port", props.getProperty("rhq.storage.gossip-port")); } catch (IOException e) { throw new RuntimeException(("Failed to load cassandra-test.properties")); } String cqlPort = System.getProperty("rhq.storage.cql-port"); entityManager.createNativeQuery( "update rhq_system_config set property_value = '" + cqlPort + "', default_property_value = '" + cqlPort + "' where property_key = 'STORAGE_CQL_PORT'").executeUpdate(); String gossipPort = System.getProperty("rhq.storage.gossip-port"); entityManager.createNativeQuery( "update rhq_system_config set property_value = '" + gossipPort + "', default_property_value = '" + gossipPort + "' where property_key = 'STORAGE_GOSSIP_PORT'").executeUpdate(); String storageUserName = System.getProperty("rhq.storage.username"); entityManager.createNativeQuery( "update rhq_system_config set property_value = '" + storageUserName + "', default_property_value = '" + storageUserName + "' where property_key = 'STORAGE_USERNAME'").executeUpdate(); String storagePassword = System.getProperty("rhq.storage.password"); entityManager.createNativeQuery( "update rhq_system_config set property_value = '" + storagePassword + "', default_property_value = '" + storagePassword + "' where property_key = 'STORAGE_PASSWORD'").executeUpdate(); } @Timeout public void initializeServer() throws RuntimeException { try { LOG.info("Initializing the testing RHQ deployment"); this.startupBean.init(); LOG.info("Initialization complete"); } catch (Throwable t) { // do NOT allow exceptions to bubble out of our method because then // the EJB container would simply re-trigger the timer and call us again // and we don't want to keep failing over and over filling the logs // in an infinite loop. LOG.fatal("The server failed to start up properly", t); } } }