package utils.test; import conf.PlayConfiguration; import services.ConfigurationService; import utils.gce.GoogleComputeEngineException; import java.io.IOException; import java.util.List; /** * Created by ricardolorenzo on 30/07/2014. */ public class TestConfiguration { private static final String YCSB_REPOSITORY = "https://github.com/RicardoLorenzo/YCSB.git"; private static final Integer MONGODB_SHARD_INIT_PORT = 27040; public static final String YCSB_DIRECTORY = "YCSB"; public static String getNodeStartupScriptContent(String serverName, String remoteScriptUrl) throws IOException, GoogleComputeEngineException { StringBuilder sb = new StringBuilder(); sb.append(PlayConfiguration.getFileContent("scripts/startup-common.sh")); sb.append("\nsetProxy "); sb.append(serverName); sb.append("\ncheckConnection http://http.debian.net/debian/dists/wheezy/Release.gpg\n"); sb.append("installPackage openjdk-7-jdk\n"); sb.append("installPackage git\n"); sb.append("installPackage maven\n"); sb.append("runCommand apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10\n"); sb.append("echo \"deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen\" >"); sb.append(" /etc/apt/sources.list.d/mongodb.list\n"); sb.append("installPackage mongodb-org-mongos\n"); sb.append("installPackage mongodb-org-shell\n\n"); sb.append("if ! [ -e \"/etc/mongodbconfig.sh\" ]; then\n"); sb.append(" checkConnection "); sb.append(remoteScriptUrl); sb.append("\n wget -O /etc/mongodbconfig.sh "); sb.append(remoteScriptUrl); sb.append("\n"); sb.append(" bash /etc/mongodbconfig.sh\n"); sb.append("fi\n"); return sb.toString(); } public static String getNodeRemoteStartupScriptContent(String serverName, List<String> configNodeNames, List<String> shardNodeNames) throws IOException, GoogleComputeEngineException { Integer shardPorcesses = ConfigurationService.getClusterNodeProcesses(); String user = ConfigurationService.TEST_USER; if(user.contains("@")) { user = user.substring(0, user.lastIndexOf("@")); } StringBuilder homeDirectory = new StringBuilder(); homeDirectory.append("/home/"); homeDirectory.append(user); StringBuilder sb = new StringBuilder(); sb.append(PlayConfiguration.getFileContent("scripts/startup-common.sh")); /** * An assumption here, is the fact that the SSH user is created, * and it is normally */ sb.append("if ! [ -e \""); sb.append(homeDirectory.toString()); sb.append("/"); sb.append(YCSB_DIRECTORY); sb.append("\" ]; then\n"); sb.append(" checkConnection http://"); sb.append(serverName); sb.append("/YCSB.git/info/refs\n"); sb.append(" runCommandAsUser "); sb.append(user); sb.append(" git clone http://"); sb.append(serverName); sb.append("/YCSB.git\n"); sb.append(" makeDirectory "); sb.append(homeDirectory.toString()); sb.append("/.m2\n"); sb.append(" echo \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>"); sb.append("<settings xmlns=\\\"http://maven.apache.org/SETTINGS/1.0.0\\\""); sb.append(" xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\""); sb.append(" xsi:schemaLocation=\\\"http://maven.apache.org/SETTINGS/1.0.0 "); sb.append(" http://maven.apache.org/xsd/settings-1.0.0.xsd\\\">"); sb.append("<proxies><proxy><active>true</active><protocol>http</protocol><host>"); sb.append(serverName); sb.append("</host><port>80</port><username></username><password></password></proxy></proxies>"); sb.append("</settings>\" > "); sb.append(homeDirectory.toString()); sb.append("/.m2/settings.xml\n"); sb.append(" chown "); sb.append(user); sb.append(":"); sb.append(user); sb.append(" "); sb.append(homeDirectory.toString()); sb.append("/.m2 -R\n"); sb.append(" runCommandAsUser "); sb.append(user); sb.append(" \"sed -i '/<module>mapkeeper<\\/module>/d' "); sb.append(homeDirectory.toString()); sb.append("/"); sb.append(YCSB_DIRECTORY); sb.append("/pom.xml\"\n"); sb.append(" runCommandAsUser "); sb.append(user); sb.append(" \"cd "); sb.append(homeDirectory.toString()); sb.append("/"); sb.append(YCSB_DIRECTORY); sb.append(" && mvn clean package -Dmaven.test.skip=true -DproxySet=true -DproxyHost="); sb.append(serverName); sb.append(" -DproxyPort=80\"\n"); sb.append("fi\n"); /** * Mongos configuration */ StringBuilder configdb = new StringBuilder(); sb.append("if ! [ -e \"/etc/mongos.sconf\" ]; then\n"); sb.append(" echo \"port = 27017\nconfigdb = "); for(String confNode : configNodeNames) { if(configdb.length() > 0) { configdb.append(","); } configdb.append(confNode); configdb.append(":27019"); } sb.append(configdb.toString()); sb.append("\nlogpath = /var/log/mongos.log\nlogappend = yes\nfork = yes\n"); sb.append("\" > /etc/mongos.conf\n"); sb.append("fi\n"); sb.append("ulimit -n 64000\n"); sb.append("ulimit -u 64000\n"); sb.append("mongos -f /etc/mongos.conf\n"); /** * Shard cluster configuration */ sb.append("if ! [ -e \"/etc/mongos.js\" ]; then\n"); sb.append(" echo \""); for(String shardNode : shardNodeNames) { for(int port = MONGODB_SHARD_INIT_PORT; port < (MONGODB_SHARD_INIT_PORT + shardPorcesses); port++) { sb.append("sh.addShard('"); sb.append(shardNode); sb.append(":"); sb.append(port); sb.append("')\n"); } } sb.append("\" > /etc/mongos.js\n"); sb.append("fi\n"); sb.append("mongo /etc/mongos.js\n"); return sb.toString(); } public static String getJumpServerStartupScriptContent(String networkRange, String testNodesStartupScriptUrl) throws IOException { StringBuilder sb = new StringBuilder(); sb.append(PlayConfiguration.getFileContent("scripts/startup-common.sh")); /** * Apache proxy configuration */ sb.append("function configApache() {\n"); sb.append(" if ! [ -e /etc/apache2/mods-enabled/proxy.load ]; then\n"); sb.append(" ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load\n"); sb.append(" ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load\n"); sb.append(" echo \"ProxyRequests On\nProxyPreserveHost On\n\n<Proxy *>\n Order deny,allow\n"); sb.append(" Deny from all\n Allow from "); sb.append(networkRange); sb.append("\n</Proxy>\" > /etc/apache2/conf.d/proxy\n"); sb.append(" fi\n"); sb.append(" service apache2 restart\n"); sb.append("}\n"); sb.append("installPackage apache2 configApache\n"); /** * YCSB git repository mirror */ sb.append("installPackage git\n"); sb.append("git clone --mirror "); sb.append(YCSB_REPOSITORY); sb.append(" /var/www/YCSB.git\n"); sb.append("PWD=$(pwd);\ncd /var/www/YCSB.git/\ngit update-server-info\ncd $PWD\n"); /** * Startup script for test nodes */ sb.append("wget -O /var/www/startup.sh \""); sb.append(testNodesStartupScriptUrl); sb.append("\"\n"); return sb.toString(); } }