package org.ow2.choreos.ee.nodes.cm; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.ow2.choreos.invoker.Invoker; import org.ow2.choreos.invoker.InvokerBuilder; import org.ow2.choreos.invoker.InvokerException; import org.ow2.choreos.nodes.datamodel.CloudNode; import org.ow2.choreos.utils.SshUtil; public class NodeSetup { public static NodeSetup setupForTest; public static boolean testing = false; private static final int trials = 3; private CloudNode node; private String scriptFileName; private Map<String, String> substitutions; private int timeoutMinutes; private String script; private Logger logger = Logger.getLogger(NodeSetup.class); public static NodeSetup getInstance(CloudNode node, String scriptFileName, int timeoutMinutes, Map<String, String> substitutions) { if (!testing) return new NodeSetup(node, scriptFileName, timeoutMinutes, substitutions); else return setupForTest; } private NodeSetup(CloudNode node, String scriptFileName, int timeoutMinutes, Map<String, String> substitutions) { this.node = node; this.scriptFileName = scriptFileName; this.timeoutMinutes = timeoutMinutes; this.substitutions = substitutions; } private void applySubstitutions() { for (Map.Entry<String, String> substitution : substitutions.entrySet()) { script = script.replace(substitution.getKey(), substitution.getValue()); } } private void getScript() { URL scriptFile; scriptFile = this.getClass().getClassLoader().getResource(scriptFileName); script = null; try { script = FileUtils.readFileToString(new File(scriptFile.getFile())); } catch (IOException e) { logger.error("Could not retrieve script " + scriptFileName); throw new IllegalStateException(); } } public void setup() throws NodeSetupException { NodeSetupTask task = new NodeSetupTask(); Invoker<String> invoker = new InvokerBuilder<String>("NodeSetupTask", task, timeoutMinutes).trials(trials) .timeUnit(TimeUnit.MINUTES).build(); getScript(); applySubstitutions(); try { invoker.invoke(); } catch (InvokerException e) { throw new NodeSetupException(); } } private class NodeSetupTask implements Callable<String> { @Override public String call() throws Exception { SshUtil ssh = new SshUtil(node.getIp(), node.getUser(), node.getPrivateKeyFile()); String output = ssh.runCommand(script); ssh.disconnect(); return output; } } }