package org.gcube.dataanalysis.dataminer.poolmanager.ansible; import java.io.File; ***REMOVED*** import java.io.InputStream; import java.io.PrintStream; import java.util.Scanner; import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Inventory; import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Playbook; import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Role; import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.AnsibleSerializeHelper; import org.tmatesoft.svn.core.SVNException; /** * This class is responsible for the interface with ansible, retrieving log, * etc. etc. It's not supposed to access templates and static stuff files. It * does not know the service datamodel. * * @author paolo * */ public class AnsibleWorker { /** * The name of the inventory */ private static String INVENTORY_NAME = "inventory.yaml"; /** * The directory containing roles */ private static String ROLES_DIR = "roles"; /** * The name of the playbook */ private static String PLAYBOOK_NAME = "playbook.yaml"; /** * The root of the worker. This corresponds to a standard ansible working dir. */ private File workerRoot; public AnsibleWorker(File root) { this.workerRoot = root; this.ensureWorkStructure(); ***REMOVED*** ***REMOVED*** public File getWorkdir() { ***REMOVED*** return this.workerRoot; ***REMOVED*** ***REMOVED*** public File getRolesDir() { return new File(this.workerRoot, ROLES_DIR); ***REMOVED*** public String getWorkerId() { return this.workerRoot.getName(); ***REMOVED*** public void ensureWorkStructure() { ***REMOVED*** generate root this.workerRoot.mkdirs(); ***REMOVED*** public void removeWorkStructure() { ***REMOVED*** remove the working dir this.workerRoot.delete(); ***REMOVED*** public File getPlaybookFile() { return new File(this.workerRoot, PLAYBOOK_NAME); ***REMOVED*** public File getInventoryFile() { return new File(this.workerRoot, INVENTORY_NAME); ***REMOVED*** public void setInventory(Inventory inventory) throws IOException { ***REMOVED*** serialize the string to the 'inventory' file AnsibleSerializeHelper.serialize(inventory, this.getInventoryFile()); ***REMOVED*** public void setPlaybook(Playbook playbook) throws IOException { ***REMOVED*** serialize the string to the 'playbook' file AnsibleSerializeHelper.serialize(playbook, this.getPlaybookFile()); ***REMOVED*** public void addRole(Role r) throws IOException { ***REMOVED*** Serialize role in the workdir AnsibleSerializeHelper.serializeRole(r, this.getRolesDir()); ***REMOVED*** public int execute(PrintStream ps) throws IOException, InterruptedException, SVNException { System.out.println(this.workerRoot); try { Process p = Runtime.getRuntime().exec("ansible-playbook -v -i " + this.getInventoryFile().getAbsolutePath() + " " + this.getPlaybookFile().getAbsolutePath()); inheritIO(p.getInputStream(), ps); inheritIO(p.getErrorStream(), ps); ***REMOVED*** writer.println(this.getStatus(p.waitFor())); ***REMOVED*** writer.close(); return p.waitFor(); ***REMOVED*** catch (IOException e) { e.printStackTrace(); ***REMOVED*** return -1; ***REMOVED*** private static void inheritIO(final InputStream src, final PrintStream dest) { new Thread(new Runnable() { public void run() { Scanner sc = new Scanner(src); while (sc.hasNextLine()) { dest.println(sc.nextLine()); ***REMOVED*** sc.close(); ***REMOVED*** ***REMOVED***).start(); ***REMOVED*** /** * Destroy the worker: * - remove the working dir */ public void destroy() { this.removeWorkStructure(); ***REMOVED*** ***REMOVED***