package dk.kaspergsm.stormdeploy.configurations; import static org.jclouds.scriptbuilder.domain.Statements.exec; import java.util.ArrayList; import java.util.List; import dk.kaspergsm.stormdeploy.userprovided.ConfigurationFactory; import org.jclouds.scriptbuilder.domain.Statement; import dk.kaspergsm.stormdeploy.Tools; /** * Contains all methods to configure Zookeeper on nodes * * @author Kasper Grud Skat Madsen */ public class Zookeeper { private Zookeeper() { } public static List<Statement> download(String installDir, String zookeeperRemoteLocation) { return Tools.download(installDir, zookeeperRemoteLocation, true, true, "zookeeper"); } public static List<Statement> configure(List<String> zkNodesHostnames, String username, String installDir, String zkDataDir, String zkSnapshotRetainCount, String zkPurgeInterval) { List<Statement> st = new ArrayList<Statement>(); StringBuilder sb = new StringBuilder(); for (int i = 1; i <= zkNodesHostnames.size(); i++) { sb.append("server."); sb.append(i); sb.append("="); sb.append(zkNodesHostnames.get(i-1)); sb.append(":2888:3888"); if (i != zkNodesHostnames.size()) sb.append("\\n"); // escaped newline } st.add(exec("cd "+ installDir +"zookeeper/conf/")); st.add(exec("[ ! -e zoo.cfg ] && cp zoo_sample.cfg zoo.cfg && echo -e \"# the zookeeper ensemble\nserver.x\" >> zoo.cfg")); if (zkSnapshotRetainCount != null && zkPurgeInterval != null) { st.add(exec("sed \"s|#autopurge.snapRetainCount=.*|autopurge.snapRetainCount="+ zkSnapshotRetainCount +"|\" -i \"zoo.cfg\"")); // set number of snapshots to retain st.add(exec("sed \"s|#autopurge.purgeInterval=.*|autopurge.purgeInterval="+ zkPurgeInterval +"|\" -i \"zoo.cfg\"")); // set zookeeper snapshot purge interval } st.add(exec("sed \"s|dataDir=.*|dataDir="+ zkDataDir +"|\" -i \"zoo.cfg\"")); // set dataDir to /tmp/zktmp st.add(exec("sed \"s/server.*/server.x/\" -i \"zoo.cfg\"")); // convert each serverline to server.x st.add(exec("sed '$!N; /^\\(.*\\)\\n\\1$/!P; D' -i \"zoo.cfg\"")); // delete duplicate lines => one server.x st.add(exec("sed \"s/server.x/" + sb.toString() + "/\" -i \"zoo.cfg\"")); // replace server.x with new lines st.add(exec("mkdir -p " + zkDataDir)); // ensure folders exist st.add(exec("chown " + username + " " + zkDataDir)); return st; } public static List<Statement> writeZKMyIds(String username, Integer zkid) { List<Statement> st = new ArrayList<Statement>(); st.add(exec("mkdir -p /tmp/zktmp")); // ensure folders exist st.add(exec("chown " + username + " /tmp/zktmp")); st.add(exec("echo " + zkid + " > /tmp/zktmp/myid")); // write myid return st; } /** * Uses Monitor to restart daemon, if it stops */ public static List<Statement> startDaemonSupervision(String username) { List<Statement> st = new ArrayList<Statement>(); String installDir = ConfigurationFactory.getConfig().getInstallDir(); st.add(exec("cd " + installDir)); st.add(exec("su -c 'case $(head -n 1 " + installDir + "daemons) in *ZK*) java -cp \""+ installDir +"sda/storm-deploy-alternative.jar\" dk.kaspergsm.stormdeploy.image.ProcessMonitor org.apache.zookeeper.server "+ installDir +"zookeeper/bin/zkServer.sh start ;; esac &' - " + username)); return st; } }