package org.zstack.test; import org.apache.commons.io.FileUtils; import org.zstack.core.Platform; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.utils.ShellResult; import org.zstack.utils.ShellUtils; import org.zstack.utils.TimeUtils; import org.zstack.utils.Utils; import org.zstack.utils.logging.CLogger; import org.zstack.utils.path.PathUtil; import java.io.File; import java.io.IOException; import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import static org.zstack.utils.StringDSL.ln; public class DBUtil { private static final CLogger logger = Utils.getLogger(DBUtil.class); public static void reDeployDB() { logger.info("Deploying database ..."); String home = System.getProperty("user.dir"); String baseDir = Utils.getPathUtil().join(home, "../"); Properties prop = new Properties(); try { prop.load(DBUtil.class.getClassLoader().getResourceAsStream("zstack.properties")); String user = System.getProperty("DB.user"); if (user == null) { user = prop.getProperty("DB.user"); if (user == null) { user = prop.getProperty("DbFacadeDataSource.user"); } if (user == null) { throw new CloudRuntimeException("cannot find DB user in zstack.properties, please set either DB.user or DbFacadeDataSource.user"); } } String password = System.getProperty("DB.password"); if (password == null) { password = prop.getProperty("DB.password"); if (password == null) { password = prop.getProperty("DbFacadeDataSource.password"); } if (password == null) { throw new CloudRuntimeException("cannot find DB user in zstack.properties, please set either DB.password or DbFacadeDataSource.password"); } } String shellcmd = String.format("build/deploydb.sh %s %s", user, password); ShellUtils.run(shellcmd, baseDir, false); logger.info("Deploying database successfully"); } catch (Exception e) { throw new CloudRuntimeException("Unable to deploy zstack database for testing", e); } } @Deprecated public static void reDeployCassandra(String... keyspaces) { // initializing platform causes zstack.properties to be load Platform.getUuid(); logger.info("Redeploying cassandra"); String cqlsh = System.getProperty("Cassandra.cqlsh"); if (cqlsh == null) { throw new RuntimeException("please set Cassandra.cqlsh in zstack.properties"); } if (cqlsh.startsWith("~")) { String userHome = System.getProperty("user.home"); cqlsh = cqlsh.replaceAll("~", userHome); } if (!PathUtil.exists(cqlsh)) { throw new RuntimeException(String.format("cannot find %s", cqlsh)); } String cqlbin = System.getProperty("Cassandra.bin"); if (cqlbin == null) { throw new RuntimeException("please set Cassandra.bin in zstack.properties"); } if (cqlbin.startsWith("~")) { String userHome = System.getProperty("user.home"); cqlbin = cqlbin.replaceAll("~", userHome); } File cassandraHome = new File(PathUtil.join(System.getProperty("user.home"), ".cassandra")); if (!cassandraHome.exists()) { cassandraHome.mkdirs(); } File cqlshrc = new File(PathUtil.join(cassandraHome.getAbsolutePath(), "cqlshrc")); try { FileUtils.writeStringToFile(cqlshrc, ln( "[connection]", "client_timeout = 1800" ).toString()); } catch (IOException e) { throw new CloudRuntimeException(e); } if (!PathUtil.exists(cqlbin)) { throw new RuntimeException(String.format("cannot find %s", cqlbin)); } ShellResult res = ShellUtils.runAndReturn(String.format("%s -e \"describe keyspaces\"", cqlsh), false); if (!res.isReturnCode(0)) { ShellUtils.run(String.format("bash -c %s &", cqlbin), false); final String finalCqlsh = cqlsh; TimeUtils.loopExecuteUntilTimeoutIgnoreException(120, 1, TimeUnit.SECONDS, new Callable<Boolean>() { @Override public Boolean call() throws Exception { ShellResult res = ShellUtils.runAndReturn(String.format("%s -e \"describe keyspaces\"", finalCqlsh), false); return res.isReturnCode(0); } }); } for (String keyspace : keyspaces) { ShellUtils.run(String.format("%s --connect-timeout=100 -e \"drop keyspace if exists %s\"", cqlsh, keyspace), false); } File schemaFolder = PathUtil.findFolderOnClassPath("mevoco/cassandra/db", true); File deployer = PathUtil.findFileOnClassPath("deploy_cassandra_db.py", true); ShellUtils.run(String.format("python %s --schema-folder %s --cqlsh %s --ip 127.0.0.1", deployer.getAbsolutePath(), schemaFolder.getAbsolutePath(), cqlsh)); } }