package it.isislab.sof.client.application.ui; import it.isislab.sof.client.application.SOFShellClient; import it.isislab.sof.core.engine.hadoop.sshclient.connection.HadoopFileSystemManager; import it.isislab.sof.core.engine.hadoop.sshclient.connection.SofManager; import it.isislab.sof.core.engine.hadoop.sshclient.utils.environment.EnvironmentSession; import it.isislab.sof.core.engine.hadoop.sshclient.utils.simulation.Loop; import it.isislab.sof.core.engine.hadoop.sshclient.utils.simulation.Simulation; import it.isislab.sof.core.engine.hadoop.sshclient.utils.simulation.Simulations; import it.isislab.sof.core.exception.ParameterException; import it.isislab.sof.core.model.parameters.xsd.elements.Parameter; import it.isislab.sof.core.model.parameters.xsd.elements.ParameterDouble; import it.isislab.sof.core.model.parameters.xsd.elements.ParameterLong; import it.isislab.sof.core.model.parameters.xsd.elements.ParameterString; import it.isislab.sof.core.model.parameters.xsd.input.Input; import it.isislab.sof.core.model.parameters.xsd.message.Message; import it.isislab.sof.core.model.parameters.xsd.output.Output; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import com.jcraft.jsch.JSchException; public class Controller { private static Controller instance = null; /*public String host_address= "172."; public String pstring="cloud"; public String port="22"; public String bindir="/home/hadoop/hadoop-2.4.0"; public String homedir="/home/hadoop/"; public String javabindir ="/usr/bin/"; public String user_name="hadoop"; public String sofhomedir="/";*/ /*public String host_address= ""; public String pstring=""; public String port=""; public String bindir=""; public String homedir=""; public String javabindir =""; public String user_name=""; public String sofhomedir=""; public String sofjarpath=""; public String sofjarrunnerpath=""; */ public String host_address= "127.0.0.1"; public String pstring="pippo"; public String port="22"; public String bindir="/isis/hadoop-2.4.0"; public String homedir="/isis/"; public String javabindir ="/usr/local/java/bin"; public String user_name="isis"; public String sofhomedir="/"; public String sofjarpath="sof-resources/SOF.jar"; public String sofjarrunnerpath="sof-resources/SOF-RUNNER.jar"; public static Controller getInstance( String host_address, String user_name, String pstring, String port, String bindir, String homedir, String javabindir, String sofhomedir, String sofjarpath, String sofrunnerjarpath) { if(instance == null) { instance = new Controller(); instance.host_address=host_address; instance.pstring=pstring; instance.port=port; instance.bindir=bindir; instance.homedir=homedir; instance.javabindir=javabindir; instance.user_name=user_name; instance.sofjarpath=sofjarpath; instance.sofjarrunnerpath=sofrunnerjarpath; return instance.login()?instance:null; } return instance; } private EnvironmentSession session; public void exit() { // c.printf("Disconnect from "+SOFShellClient.host+".\n"); SofManager.disconnect(session); System.exit(0); } public void license() { // c.printf("SOF is a tool utility powerd by ISISLab, 2014.\n"); } public void help() { // c.printf("**************************************ISISLab******************************************************\n*"); // c.printf("***************************************************************************************************\n*"); // c.printf("* help |print commands list. *\n*"); // //c.printf("* usage |print commands usage, usage <command, >. *\n*"); // c.printf("* submit |exec the simulation corresponding to the given id. *\n*"); // c.printf("* createsimulation |create new simulation execution. *\n*"); // c.printf("* getsimulations |print all simulations created by the user. *\n*"); // c.printf("* getsimulation |print status of the simulation corresponding to the given id. *\n*"); // //c.printf(" printresult |print metrics on the results of the simulation corresponding to the given id.\n"); // c.printf("* getresult |download the results of the simulation corresponding to the given id. *\n*"); // c.printf("* list |show the simulation list. *\n*"); // c.printf("* kill |kill the simulation corresponding to the given id. *\n*"); // c.printf("* makexml |generate the xml file corresponding to the given input. *\n*"); // c.printf("* exit |disconnect user . *\n*"); // c.printf("***************************************************************************************************\n"); } public void start(String ...params) { /** * Simulation s = getSimulationDatabyId(session, username, simID); */ if(params == null || params.length < 1 ) { // c.printf("usage of submit command : submit ID [ID:intger ID of simulation execution environment]\n"); }else{ //int simID = Integer.parseInt(params[0])-1; Simulations sims = SofManager.getSimulationsData(session); if(sims == null){ // c.printf("No such simulation"); } Simulation sim = null; for(Simulation s : sims.getSimulations()) if(s.getId().equals(params[0])){ sim =s; break; } //sim = sofManager.getSimulationDatabyId(session, session.getUsername(), simID); SofManager.runAsynchronousSimulation(session,sim); //sofManager.runSimulation(session, session.getUsername(), simID, s.getLoop()); } } public void stop(String ...params){ Simulations listSim = SofManager.getSimulationsData(session); if(listSim == null){ } Simulation sim = null; for(Simulation s : listSim.getSimulations()) if(s.getId().equals(params[0])){ sim =s; break; } if(sim.getState().equals(Simulation.RUNNING)){ Message stop = new Message(); stop.setId(SofManager.getMexID()); stop.setMessage(Message.STOP_MESSAGE); SofManager.sendMessage(session, sim, stop); return; } } public void createsimulation(String ... params) { String parsedParams[] = SofManager.parseParamenters(params,4); if(parsedParams.length == 6) { try { SofManager.checkParamMakeSimulationFolder(parsedParams); } catch (ParameterException e1) { System.out.print(e1.getMessage()); } try { SofManager.makeSimulationFolder( session, parsedParams[0],//MODEL TYPE MASON - NETLOGO -GENERIC parsedParams[1],//SIM NAME parsedParams[2],//INPUT.XML PATH parsedParams[3],//OUTPUT.XML PATH parsedParams[4],//DESCRIPTION SIM parsedParams[5], //SIMULATION EXEC PATH "");//only generic } catch (Exception e) { System.out.print("Error in making execution environment!\n"); } }else if(parsedParams.length == 7){ try { SofManager.checkParamMakeSimulationFolder(parsedParams); } catch (ParameterException e1) { System.out.print(e1.getMessage()); } try { SofManager.makeSimulationFolder( SOFShellClient.session, parsedParams[0],//MODEL TYPE MASON - NETLOGO -GENERIC parsedParams[1],//SIM NAME parsedParams[2],//INPUT.XML PATH parsedParams[3],//OUTPUT.XML PATH parsedParams[4],//DESCRIPTION SIM parsedParams[5],//SIMULATION EXEC PATH parsedParams[6]); //intepretergenericpath } catch (Exception e) { System.out.print("Error in making execution environment!\n"); } } else{ System.out.print("Error "+(parsedParams.length<6?"few":"much more")+" parameters.:\n"); System.out.print("usage: MODEL[MASON-NETLOGO-GENERIC] SIM-NAME[String]INPUT.xml[String absolutely]" + " Output.xml[String absolutely path] DESCRIPTION-SIM[String] SIMULATION-EXECUTABLE-MODEL[String absolutely path]\n"); } } public void createsimulationloop(String ... params) { String parsedParams[] = SofManager.parseParamenters(params,8); if(parsedParams.length == 10) { try { SofManager.checkParamMakeSimulationFolder(parsedParams); } catch (ParameterException e1) { System.out.print(e1.getMessage()); } try { SofManager.makeSimulationFolderForLoop( session, parsedParams[0]/*MODEL TYPE MASON - NETLOGO -GENERIC*/, parsedParams[1],/*SIM NAME*/ parsedParams[2],/*domain_pathname*/ parsedParams[3],/*bashCommandForRunnableFunctionSelection */ parsedParams[4],/*bashCommandForRunnableFunctionEvaluate*/ parsedParams[5],/*output_description_filename*/ parsedParams[6],/*executable_selection_function_filename*/ parsedParams[7],/*executable_rating_function_filename*/ parsedParams[8],/*description_simulation*/ parsedParams[9],"");/*executable_simulation_filename*/ } catch (Exception e) { System.out.print("Error in making execution environment!\n"); System.out.print(e.getMessage()); e.printStackTrace(); } }else if(parsedParams.length == 11){ try { SofManager.checkParamMakeSimulationFolder(parsedParams); } catch (ParameterException e1) { System.out.print(e1.getMessage()); e1.printStackTrace(); } try { SofManager.makeSimulationFolderForLoop( session, parsedParams[0]/*MODEL TYPE MASON - NETLOGO -GENERIC*/, parsedParams[1],/*SIM NAME*/ parsedParams[2],/*domain_pathname*/ parsedParams[3],/*bashCommandForRunnableFunctionSelection */ parsedParams[4],/*bashCommandForRunnableFunctionEvaluate*/ parsedParams[5],/*output_description_filename*/ parsedParams[6],/*executable_selection_function_filename*/ parsedParams[7],/*executable_rating_function_filename*/ parsedParams[8],/*description_simulation*/ parsedParams[9],/*executable_simulation_filename*/ parsedParams[10]);//interpreter generic } catch (Exception e) { System.out.print("Error in making execution environment!\n"); e.printStackTrace(); } }else{ System.out.print("Error "+(parsedParams.length<9?"few":"much more")+" parameters.:\n"); System.out.print("usage: MODEL[MASON-NETLOGO-GENERIC] SIM-NAME[String] "+ "DOMAIN.xml[String absolutely]"+"bash command[for function selection example /usr/bin/sh]" + " Output.xml[String absolutely path] "+"function selection absolutly path"+ "rating selection absolutly path"+"DESCRIPTION-SIM[String] SIMULATION-EXECUTABLE-MODEL[String absolutely path]\n"); } } public Simulations getsimulations(String ... params) { return SofManager.getSimulationsData(session); } public void getsimulation(String ... params) { if(params == null || params.length < 1 ) { // c.printf("few parameters!\n Usage: getsimuation #IDSIM"); }else{ int simID = Integer.parseInt(params[0])-1; Simulations listSim = SofManager.getSimulationsData(session); if(listSim == null){ // c.printf("No such simulation"); } Simulation sim = listSim.getSimulations().get(simID); try { if(!HadoopFileSystemManager. ifExists(session,SofManager.fs.getHdfsUserPathSimulationByID(sim.getId()) )) {} // c.printf("Simulation SIM"+simID+" not exists\n"); // c.printf(sim+"\n"); } catch (NumberFormatException e) { e.printStackTrace(); } catch (JSchException e) { // c.printf("Error during resource creating\n"+e.getMessage()); e.printStackTrace(); } catch (IOException e) { // c.printf("Error during resource creating\n"+e.getMessage()); e.printStackTrace(); } } } public void getresult(String ... params) { if(params == null) { // c.printf("Error few parameters!\n Usage: getresult simID [destinationDirPath]"); }else{ Simulations sims = SofManager.getSimulationsData(session); if(sims == null){ // c.printf("No such simulation"); } Simulation sim = null; try{ for(Simulation s : sims.getSimulations()) if(s.getId().equals(params[0])){ sim =s; break; } }catch(IndexOutOfBoundsException e){ // c.printf("No such simulation"); } //if no path is specified, saves in current directory String path = (params.length < 2)? System.getProperty("user.dir"):params[1]; // c.printf("Simulation will download in: "+path); SofManager.downloadSimulation(session,sim.getId(),path); } } public void getresultExcel(String ... params) { if(params == null) { // c.printf("Error few parameters!\n Usage: getresult simID [destinationDirPath]"); }else{ Simulations sims = SofManager.getSimulationsData(session); if(sims == null){ // c.printf("No such simulation"); } Simulation sim = null; try{ for(Simulation s : sims.getSimulations()) if(s.getId().equals(params[0])){ sim =s; break; } }catch(IndexOutOfBoundsException e){ // c.printf("No such simulation"); } //if no path is specified, saves in current directory String path = (params.length < 2)? System.getProperty("user.dir"):params[1]; path+=File.separator+"SIM-"+sim.getId()+".xls"; SXSSFWorkbook workbook = new SXSSFWorkbook(); Sheet sheet = workbook.createSheet("Simulation ID "+sim.getId()); int row_num=0; if(sim.getLoop()) { List<Loop> loops=sim.getRuns().getLoops(); Collections.sort(loops,new Comparator<Loop>() { @Override public int compare(Loop o1, Loop o2) { return Integer.compare(o1.getId(), o2.getId()); } }); for(Loop l: loops) { Row row_loop=sheet.createRow(++row_num); Cell c_loop_id=row_loop.createCell(0); c_loop_id.setCellValue("Loop ID "+l.getId()); class PointTree { public Input getI() { return i; } public void setI(Input i) { this.i = i; } public Output getO() { return o; } public void setO(Output o) { this.o = o; } private Input i; private Output o; } HashMap<Integer, PointTree> mapio=new HashMap<Integer, PointTree>(); if(l.getInputs()!=null) { for(Input i: l.getInputs().getinput_list()) { PointTree p=new PointTree(); p.setI(i); mapio.put(i.id, p); } if(l.getOutputs()!=null && l.getOutputs().getOutput_list()!=null) for(Output i: l.getOutputs().getOutput_list()) { mapio.get(i.getIdInput()).setO(i); } else { System.out.println("No output found."); } for (Integer pt : mapio.keySet()) { Row row_input_id=sheet.createRow(++row_num); Cell c_input_id=row_input_id.createCell(1); c_input_id.setCellValue("Input ID "+pt); Row row_input_names=sheet.createRow(++row_num); Row row_input_values=sheet.createRow(++row_num); Row row_output_id=sheet.createRow(++row_num); Cell c_output_id=row_output_id.createCell(1); c_output_id.setCellValue("Output ID "+pt); Row row_output_names=sheet.createRow(++row_num); Row row_output_values=sheet.createRow(++row_num); int cell_input=1,cell_output=1; for(Parameter p : mapio.get(pt).getI().param_element) { Cell c_input_name=row_input_names.createCell(cell_input); Cell c_input_value=row_input_values.createCell(cell_input); cell_input++; c_input_name.setCellValue(p.getvariable_name()); if(p.getparam() instanceof ParameterDouble) c_input_value.setCellValue(((ParameterDouble)p.getparam()).getvalue()); else if(p.getparam() instanceof ParameterString) c_input_value.setCellValue(((ParameterString)p.getparam()).getvalue()); else if(p.getparam() instanceof ParameterLong) c_input_value.setCellValue(((ParameterLong)p.getparam()).getvalue()); } if(mapio.get(pt).getO()!=null) for(Parameter p : mapio.get(pt).getO().output_params) { Cell c_output_name=row_output_names.createCell(cell_output); Cell c_output_value=row_output_values.createCell(cell_output); cell_output++; c_output_name.setCellValue(p.getvariable_name()); if(p.getparam() instanceof ParameterDouble) c_output_value.setCellValue(((ParameterDouble)p.getparam()).getvalue()); else if(p.getparam() instanceof ParameterString) c_output_value.setCellValue(((ParameterString)p.getparam()).getvalue()); else if(p.getparam() instanceof ParameterLong) c_output_value.setCellValue(((ParameterLong)p.getparam()).getvalue()); } } } } } try { FileOutputStream out = new FileOutputStream(new File(path)); workbook.write(out); out.close(); System.out.println("Excel written successfully.."); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void list(String ... params) { Simulations sims = SofManager.getSimulationsData(session); if(sims == null){ // c.printf("No such simulation"); } for(int i=1; i<=sims.getSimulations().size(); i++){ int simID= i-1; Simulation s = sims.getSimulations().get(simID); // c.printf("*****************************************************************************************************************\n"); // c.printf("sim-id: "+i+" name: "+s.getName()+" state: "+s.getState()+" time: "+s.getCreationTime()+" hdfsId: "+s.getId()+" *\n"); // c.printf("*****************************************************************************************************************\n"); } } public void kill(int simID,String ... params) { if(params == null || params.length < 1 ) { // c.printf("Error few parameters!\n Usage: kill simID"); }else{ // int simID = Integer.parseInt(params[0])-1; Simulations listSim = SofManager.getSimulationsData(session); if(listSim == null){ // c.printf("No such simulation"); } if(listSim.getSimulations().size()-1<simID){ // c.printf("Simulation not exists"); } Simulation sim = listSim.getSimulations().get(simID); String cmd="pkill -f \""+sim.getProcessName()+"\""; String bash = "if "+cmd+" ; then echo 0; else echo -1; fi"; System.err.println(bash); try { HadoopFileSystemManager.exec(session,bash); } catch (Exception e ) { e.printStackTrace(); } } } private boolean login() { EnvironmentSession session=null; boolean accessGranted=false; int attempts = 0; while (!accessGranted && attempts < 5) { try { //-h 127.0.0.1 -bindir /isis/hadoop-2.4.0 -homedir /isis/ -javabindir /usr/local/java/bin/ if(bindir.endsWith("/")) bindir = bindir.substring(0, bindir.indexOf("/")-1); if(!homedir.endsWith("/")){ homedir+="/"; } if(!javabindir.endsWith("/")) javabindir+="/"; if(!sofhomedir.endsWith("/")) sofhomedir+="/"; SofManager.setFileSystem(bindir,System.getProperty("user.dir"), sofhomedir, homedir, javabindir ,user_name); if ((session=SofManager.connect(user_name, host_address, pstring, bindir,Integer.parseInt(port), new FileInputStream(System.getProperty("user.dir")+File.separator+"sof-resources"+File.separator+"SOF.jar"), new FileInputStream(System.getProperty("user.dir")+File.separator+"sof-resources"+File.separator+"SOF-RUNNER.jar") ))!=null) { // System.out.println("Connected. Type \"help\", \"usage <command>\" or \"license\" for more information."); attempts = 0; accessGranted = true; break; }else{ // System.err.println("Login Correct but there are several problems in the hadoop environment, please contact your hadoop admin."); System.exit(-1); } } catch (Exception e) { // System.err.println("Login Error. Check your credentials and ip:port of your server and try again .. "); e.printStackTrace(); } } this.session=session; return session!=null; } }