Author: bleny Date: 2010-07-05 12:34:19 +0000 (Mon, 05 Jul 2010) New Revision: 3074 Log: adding diswork support with embedded daemon and hard-coded bootstrap Added: isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/simulator/launcher/DisworkSimulatorLauncher.java Modified: isis-fish/branches/3.3.0.4-disworksupport/pom.xml isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/IsisConfig.java isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/ui/simulator/filter/SimulationFilterDialog.java isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-en_GB.properties isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-fr_FR.properties Modified: isis-fish/branches/3.3.0.4-disworksupport/pom.xml =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/pom.xml 2010-06-28 11:48:31 UTC (rev 3073) +++ isis-fish/branches/3.3.0.4-disworksupport/pom.xml 2010-07-05 12:34:19 UTC (rev 3074) @@ -319,6 +319,17 @@ <artifactId>tools</artifactId> <version>1.6.0.16</version> </dependency> + <dependency> + <groupId>org.nuiton.diswork</groupId> + <artifactId>diswork-daemon</artifactId> + <version>0.0.1-SNAPSHOT</version> + <exclusions> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon</artifactId> + </exclusion> + </exclusions> + </dependency> <!-- Tests --> <dependency> @@ -650,6 +661,15 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>2.0.2</version> + <configuration> + <source>1.6</source> + <target>1.6</target> + </configuration> + </plugin> </plugins> </build> Modified: isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2010-06-28 11:48:31 UTC (rev 3073) +++ isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2010-07-05 12:34:19 UTC (rev 3074) @@ -49,6 +49,7 @@ import fr.ifremer.isisfish.actions.VCSAction; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.simulator.SimulationControl; +import fr.ifremer.isisfish.simulator.launcher.DisworkSimulatorLauncher; import fr.ifremer.isisfish.simulator.launcher.InProcessSimulatorLauncher; import fr.ifremer.isisfish.simulator.launcher.SSHSimulatorLauncher; import fr.ifremer.isisfish.simulator.launcher.SimulationService; @@ -966,7 +967,8 @@ SIMULATOR_LAUNCHER(SimulationService.SIMULATION_LAUNCHER + ".3", _("isisfish.config.main.localSimulator.description"), InProcessSimulatorLauncher.class.getName()), SIMULATOR_LAUNCHER2(SimulationService.SIMULATION_LAUNCHER + ".1", _("isisfish.config.main.subSimulator.description"), SubProcessSimulationLauncher.class.getName()), SIMULATOR_LAUNCHER_REMOTE(SimulationService.SIMULATION_LAUNCHER + ".2", _("isisfish.config.main.remoteCaparmor.description"), SSHSimulatorLauncher.class.getName()), - + SIMULATOR_DISWORK(SimulationService.SIMULATION_LAUNCHER + ".4", _("isisfish.config.main.disworkSimulator.description"), DisworkSimulatorLauncher.class.getName()), + /** Serveur accessible par ssh : address */ SIMULATOR_SSH_SERVER("simulation.ssh.server", _("isisfish.config.main.simulation.ssh.server.description"), "caparmor"), /** Serveur accessible par ssh : login */ Added: isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/simulator/launcher/DisworkSimulatorLauncher.java =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/simulator/launcher/DisworkSimulatorLauncher.java (rev 0) +++ isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/simulator/launcher/DisworkSimulatorLauncher.java 2010-07-05 12:34:19 UTC (rev 3074) @@ -0,0 +1,239 @@ +package fr.ifremer.isisfish.simulator.launcher; + +import static org.nuiton.i18n.I18n._; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.rmi.RemoteException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.diswork.daemon.DisworkConfig; +import org.nuiton.diswork.daemon.DisworkDaemon; +import org.nuiton.diswork.daemon.DisworkException; +import org.nuiton.diswork.daemon.JobDescription; +import org.nuiton.util.FileUtil; +import org.nuiton.util.ZipUtil; + +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.simulator.SimulationControl; + +/** + * This class implements SimulatorLauncher by calling a diswork daemon + * + * @author bleny + */ +public class DisworkSimulatorLauncher implements SimulatorLauncher { + private static final Log log = + LogFactory.getLog(DisworkSimulatorLauncher.class); + + protected static DisworkDaemon disworkDaemon; + + protected static Map<String, JobDescription> jobs = + new HashMap<String, JobDescription>(); + + + public DisworkSimulatorLauncher() { + if (disworkDaemon == null) { + DisworkConfig config = new DisworkConfig(); + config.setBootstrapIp("192.168.99.119"); + config.setBootstrapPort(19002); + config.setActivityStrategy("none"); + config.setUsedPort(31000); + try { + disworkDaemon = new DisworkDaemon(config); + } catch (DisworkException e) { + log.error("unable to boot diswork FS"); + throw new RuntimeException("unable to boot diswork FS", e); + } + } + + try { + for (JobDescription job : disworkDaemon.getAllJobs()) { + jobs.put(job.getJobName(), job); + } + // FIXME 20100702 bleny daemon may contains not only isis-jobs + log.info(jobs.size() + "jobs retrieved from diswork"); + } catch (DisworkException e) { + log.error("unable to boot diswork FS"); + throw new RuntimeException("unable to boot diswork FS", e); + } + } + + + // TODO 20100628 bleny upload application if needed, whatever the version + protected void submitIsisApplication(String isisVersion) { + try { + log.info("submitting isis-fish " + isisVersion + " to diswork"); + URL url = new URL("http://isis-fish.labs.libre-entreprise.org/download/version3/isis-fish-3.3.0..."); + disworkDaemon.submitApplication("isis-fish", isisVersion, url.openStream()); + } catch (MalformedURLException e) { + // hardcoded URL cannot be malformed + } catch (DisworkException e) { + log.error("error while submitting application ", e); + } catch (IOException e) { + log.error("error while submitting application ", e); + } + } + + @Override + public void simulate(SimulationService simulationService, + SimulationItem simulationItem) throws RemoteException { + + + JobDescription jobDescription = new JobDescription(); + String simulationId = simulationItem.getControl().getId(); + jobDescription.setJobName(simulationId); + + // TODO 20100702 bleny use isisVersion + // String isisVersion = simulationItem.getParameter().getIsisFishVersion(); + String isisVersion = "3.3.0.4-SNAPSHOT"; + + submitIsisApplication(isisVersion); + jobDescription.setApplication("isis-fish", isisVersion); + + InputStream simulationZipData; + try { + simulationZipData = new FileInputStream(simulationItem.getSimulationZip()); + } catch (FileNotFoundException e) { + // should exists + log.error("can't find simulation data", e); + throw new RuntimeException("can't find simulation data", e); + } + String simulationZipName = "simulation-" + simulationId + "-preparation.zip"; + jobDescription.addInput(simulationZipName, simulationZipData); + + String resultZipName = "simulation-" + simulationId + "-result.zip"; + jobDescription.addOutput(resultZipName); + + String isisJarPath = "isis-fish-" + isisVersion + "/isis-fish-" + + isisVersion + ".jar"; + String commandLine = "%java -Xmx2500M -jar" + + " " + isisJarPath + + " --option launch.ui false" + + " --option perform.vcsupdate false" + + " --option perform.migration false" + + " --option perform.cron false" + + " --simulateRemotelly" + + " " + simulationId + + " " + simulationZipName + + " " + resultZipName; + jobDescription.setCommandLine(commandLine); + + String standardOutputName = "simulation-" + simulationId + "-output.txt"; + jobDescription.setStandardOutput(standardOutputName); + jobDescription.addOutput(standardOutputName); + + jobs.put(simulationId, jobDescription); + + try { + log.info("submitting job " + jobDescription.toJSDL()); + disworkDaemon.submitJob(jobDescription); + } catch (DisworkException e) { + log.error("error while submiting job to diswork", e); + throw new RemoteException("error while submiting job to diswork", e); + } + } + + @Override + public int maxSimulationThread() { + return 1; + } + + @Override + public int getCheckProgressionInterval() { + return 10 * 60; // ten minutes + } + + @Override + public SimulationStorage getSimulationStorage( + SimulationService simulationService, SimulationControl control) + throws RemoteException { + String simulationId = control.getId(); + + SimulationStorage simulationStorage = SimulationStorage + .getSimulation(simulationId); + + return simulationStorage; + } + + protected File downloadResults(JobDescription jobDescription) + throws DisworkException { + + + OutputStream out = null; + try { + File tempDir = FileUtil.createTempDirectory("isis-results-" + + jobDescription.getJobName(), null); + Map<String, InputStream> results = disworkDaemon.getResults(jobDescription); + for (String fileName : results.keySet()) { + File localFile = new File(tempDir, fileName); + localFile.deleteOnExit(); + log.debug("Downloading results in " + localFile.getAbsolutePath()); + out = new FileOutputStream(localFile); + // copy data from diswork to local FS + IOUtils.copy(results.get(fileName), out); + + if (fileName.endsWith(".zip")) { + ZipUtil.uncompress(localFile, SimulationStorage.getSimulationDirectory()); + } + } + + FileUtil.deleteRecursively(tempDir); + } catch (IOException e) { + log.error("unable to write results on the local FS", e); + throw new RuntimeException("unable to write results on the local FS", e); + } finally { + IOUtils.closeQuietly(out); + } + + return new File(SimulationStorage.getSimulationDirectory() + File.separator + jobDescription.getJobName()); + } + + @Override + public void updateControl(SimulationService simulationService, + SimulationControl control) throws RemoteException { + JobDescription jobDescription = jobs.get(control.getId()); + if (jobDescription == null) { + log.error("unknow Id" + control.getId()); + } else { + try { + if (disworkDaemon.isFinished(jobDescription)) { + // downloads the results + File resultDir = downloadResults(jobDescription); + File controlFile = new File(resultDir, SimulationStorage.CONTROL_FILENAME); + log.debug("control file is " + controlFile.getAbsolutePath()); + SimulationStorage.readControl(controlFile, control, "stop"); + } + } catch (DisworkException e) { + log.error("error while retrieving status|results for job", e); + throw new RemoteException("error while retrieving status|results for job", e); + } + } + } + + @Override + public void simulationStopRequest(SimulationJob job) throws RemoteException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("not yet implemented"); + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return _("isisfish.simulator.launcher.diswork"); + } + +} Modified: isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/ui/simulator/filter/SimulationFilterDialog.java =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/ui/simulator/filter/SimulationFilterDialog.java 2010-06-28 11:48:31 UTC (rev 3073) +++ isis-fish/branches/3.3.0.4-disworksupport/src/main/java/fr/ifremer/isisfish/ui/simulator/filter/SimulationFilterDialog.java 2010-07-05 12:34:19 UTC (rev 3074) @@ -20,7 +20,7 @@ "Les crit\u00E8res de type texte (simulationName,simulatorName,...) utilise des expresions rationnelles." + "<br/> La liste des r\u00E9sultats se met automatiquement \u00E0 jour lors de votre saisie." + "<h3>Les expressions rationnelles</h3>" + - "Une expression rationnelle est un motif de recherche sur une chaine de caract\u00E8res."+ + "Une pattern rationnelle est un motif de recherche sur une chaine de caract\u00E8res."+ "" + "Voici quelques caract\u00E8res utilisables dans les E.R : " + "<ul>" + @@ -33,7 +33,7 @@ "<br/>" + " Pour plus de renseignement sur les expressions rationnelles, reportez vous au lien suivant :" + "<ul>" + - "<li><a href='http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html'>Les expression rationnelles en Java</a></li>" + + "<li><a href='http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html'>Les pattern rationnelles en Java</a></li>" + "</ul>"); doc.setText(sb.toString()); doc.setCaretPosition(0); Modified: isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-en_GB.properties =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-en_GB.properties 2010-06-28 11:48:31 UTC (rev 3073) +++ isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-en_GB.properties 2010-07-05 12:34:19 UTC (rev 3074) @@ -155,6 +155,7 @@ isisfish.config.main.defaultResultNames.description=Result names to manage during a simulation isisfish.config.main.defaultSimulator.description=Default simulator to use to simulate isisfish.config.main.defaultTagValue.description= +isisfish.config.main.disworkSimulator.description=Diswork isisfish.config.main.encoding.description=encoding used on system isisfish.config.main.javadocDirectory.description=Javadoc generation directory isisfish.config.main.javadocURL.description=Javadoc url Modified: isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-fr_FR.properties =================================================================== --- isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-fr_FR.properties 2010-06-28 11:48:31 UTC (rev 3073) +++ isis-fish/branches/3.3.0.4-disworksupport/src/main/resources/i18n/isis-fish-fr_FR.properties 2010-07-05 12:34:19 UTC (rev 3074) @@ -155,6 +155,7 @@ isisfish.config.main.defaultResultNames.description=les noms des r\u00E9sultats \u00E0 traiter durant une simulation isisfish.config.main.defaultSimulator.description=le nom du simulateur par d\u00E9faut \u00E0 utiliser lors d'une simulation isisfish.config.main.defaultTagValue.description= +isisfish.config.main.disworkSimulator.description=Diswork isisfish.config.main.encoding.description=l'encoding du syst\u00E8me isisfish.config.main.javadocDirectory.description=dossier de g\u00E9n\u00E9ration de la javadoc des scripts isisfish.config.main.javadocURL.description=l'url de la javadoc des scripts