org/objectweb/proactive/core/process/unicore/UnicoreProActiveClient.java

00001 /* 
00002  * ################################################################
00003  * 
00004  * ProActive: The Java(TM) library for Parallel, Distributed, 
00005  *            Concurrent computing with Security and Mobility
00006  * 
00007  * Copyright (C) 1997-2007 INRIA/University of Nice-Sophia Antipolis
00008  * Contact: proactive@objectweb.org
00009  * 
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Lesser General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2.1 of the License, or any later version.
00014  *  
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Lesser General Public License for more details.
00019  * 
00020  * You should have received a copy of the GNU Lesser General Public
00021  * License along with this library; if not, write to the Free Software
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00023  * USA
00024  *  
00025  *  Initial developer(s):               The ProActive Team
00026  *                        http://www.inria.fr/oasis/ProActive/contacts.html
00027  *  Contributor(s): 
00028  * 
00029  * ################################################################
00030  */ 
00031 package org.objectweb.proactive.core.process.unicore;
00032 
00033 import java.io.File;
00034 import java.lang.reflect.Field;
00035 import java.net.URL;
00036 import java.util.Vector;
00037 
00038 import org.apache.log4j.Logger;
00039 import org.objectweb.proactive.core.util.log.Loggers;
00040 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00041 import org.unicore.User;
00042 import org.unicore.Vsite;
00043 import org.unicore.resources.CapacityResource;
00044 import org.unicore.resources.Memory;
00045 import org.unicore.resources.Node;
00046 import org.unicore.resources.Priority;
00047 import org.unicore.resources.PriorityValue;
00048 import org.unicore.resources.Processor;
00049 import org.unicore.resources.RunTime;
00050 
00051 import com.pallas.unicore.client.Client;
00052 import com.pallas.unicore.client.UserDefaults;
00053 import com.pallas.unicore.client.plugins.script.ScriptContainer;
00054 import com.pallas.unicore.client.util.ClientPluginManager;
00055 import com.pallas.unicore.client.util.TaskPlugable;
00056 import com.pallas.unicore.client.xml.XMLObjectWriter;
00057 import com.pallas.unicore.container.ActionContainer;
00058 import com.pallas.unicore.container.JobContainer;
00059 import com.pallas.unicore.extensions.FileImport;
00060 import com.pallas.unicore.extensions.NamedResourceSet;
00061 import com.pallas.unicore.extensions.Usite;
00062 import com.pallas.unicore.extensions.Usite.Type;
00063 import com.pallas.unicore.requests.SubmitJob;
00064 import com.pallas.unicore.resourcemanager.ResourceManager;
00065 import com.pallas.unicore.resourcemanager.ResourceTray;
00066 
00067 
00074 public class UnicoreProActiveClient {
00075     static Logger logger = ProActiveLogger.getLogger(Loggers.DEPLOYMENT_PROCESS);
00076     private JobContainer jc;
00077     private NamedResourceSet namedResourceSet;
00078     boolean jobIsBuilt = false;
00079 
00080     // Unicore Site conf parameters
00081     private UnicoreParameters uParam;
00082     static final String CLIENTUSAGE =
00083         "-jobName JobName -keypassword KeyPassWord -keyfilepath KeyFilePath " +
00084         "-unicoredir UnicoreDir -submitJob [true|false] -saveJob [true|false] " +
00085         "-usitename Name -usitetype [CLASSIC|REGISTRY] -usiteurl Url " +
00086         "-vsitename Name -vsitenodes Nodes -vsiteprocessors Processors " +
00087         "-vsitememory Memory -vsiteruntime Runtime " +
00088         "-vsitepriority [high|low|normal|development|whenever]";
00089 
00090     public UnicoreProActiveClient(UnicoreParameters uParam) {
00091         this.uParam = uParam;
00092 
00093         //Prompt the user for a keypassword if not
00094         //specified in the descriptor file
00095         if ((uParam.getKeyPassword() == null) ||
00096                 (uParam.getKeyPassword().length() <= 0)) {
00097             UnicorePasswordGUI upGUI = new UnicorePasswordGUI();
00098             uParam.setKeyPassword(upGUI.getKeyPassword());
00099         }
00100     }
00101 
00115     private void initStaticClientFields(Boolean noGui, String unicoreDir,
00116         Boolean testGrid) {
00117         try {
00118             Class clientClass = Client.class;
00119 
00120             Field fNoGui = clientClass.getDeclaredField("noGui");
00121             Field fUnicoreDir = clientClass.getDeclaredField("unicoreDir");
00122             Field fTestGrid = clientClass.getDeclaredField("testGrid");
00123 
00124             fNoGui.setAccessible(true);
00125             fUnicoreDir.setAccessible(true);
00126             fTestGrid.setAccessible(true);
00127 
00128             //System.out.println(f.getName()+ "=" + (Boolean)f.get(null));
00129             fNoGui.set(null, noGui); //  field ==> (object==null)
00130             fUnicoreDir.set(null, unicoreDir);
00131             fTestGrid.set(null, testGrid);
00132         } catch (Exception e) {
00133             System.err.println("Error in getField");
00134             e.printStackTrace();
00135             System.exit(1);
00136         }
00137     }
00138 
00155     private Vsite getVsitebyName(Usite us, String name) {
00156         Vsite vs;
00157         Vector vSiteVector = ResourceManager.getVsites(us);
00158 
00159         for (int i = 0; i < vSiteVector.size(); i++) {
00160             vs = (Vsite) vSiteVector.elementAt(i);
00161             if (vs.getName().equals(name)) {
00162                 return vs;
00163             }
00164         }
00165 
00166         System.err.println("Error Vsite (" + name + ") not found for: " +
00167             us.toString());
00168         return null;
00169     }
00170 
00182     private void initResourceManager(String keystorefile, String keypassword) {
00183         ResourceManager.loadImages();
00184         Client client = new Client();
00185         try {
00186             ResourceManager.loadKeystore(keystorefile, keypassword.toCharArray());
00187         } catch (Exception e) {
00188             System.err.println("Key not   loaded:" + keystorefile);
00189             e.printStackTrace();
00190         }
00191     }
00192 
00193     private TaskPlugable getTaskPlugin(String name) {
00194         ClientPluginManager pluginManager = Client.getPluginManager();
00195         pluginManager.stopPlugins();
00196         UserDefaults userDefaults = ResourceManager.getUserDefaults();
00197         pluginManager.scanPlugins(userDefaults.getPluginDirectory());
00198         pluginManager.startPlugins(ResourceManager.getCurrentInstance());
00199         Vector taskplugins = pluginManager.getTaskPlugins();
00200         for (int i = 0; i < taskplugins.size(); i++) {
00201             TaskPlugable tp = (TaskPlugable) taskplugins.elementAt(i);
00202             if (tp.getName().equals(name)) {
00203                 return tp;
00204             }
00205         }
00206         return null;
00207     }
00208 
00209     private JobContainer getNewJob(String name, String filename) {
00210         JobContainer jc = new JobContainer();
00211 
00212         //jc.setIdentifier();
00213         jc.setName(name); //Internal job name
00214         jc.setFilename(filename); //Filename when saved
00215         jc.setIgnoreFailure(false); //Set ignore failure flag
00216         //jc.setDependencies(); //Set dependencies
00217         return jc;
00218     }
00219 
00220     private ScriptContainer addScriptTask(String taskName, String scriptContent) {
00221         TaskPlugable plugableScript = getTaskPlugin("Script");
00222         if (plugableScript == null) {
00223             System.err.println("ERROR ScripTask object not found!!!");
00224             return null;
00225         }
00226 
00227         ScriptContainer sc = (ScriptContainer) plugableScript.getContainerInstance(jc);
00228 
00229         sc.setName(taskName);
00230         sc.setIgnoreFailure(false);
00231         sc.setCommandLine("");
00232         sc.setStderr("");
00233         sc.setStdin("");
00234         sc.setStdout("");
00235         sc.setScriptContents(scriptContent);
00236 
00237         jc.addTask(sc);
00238         return sc;
00239     }
00240 
00241     private Usite getNewUsite(String urlString, String usiteName, Type Usite) {
00242         URL usiteURL = null;
00243         try {
00244             usiteURL = new URL(urlString);
00245         } catch (Exception e) {
00246             System.err.println("URL Generation Error");
00247             e.printStackTrace();
00248         }
00249         Usite us = new Usite(usiteURL, usiteName, Usite);
00250         return us;
00251     }
00252 
00253     private void setCapResDefaultMaxMin(CapacityResource candidate) {
00254         NamedResourceSet namedResourceSet = ResourceManager.getResourceSet(jc.getVsite());
00255 
00256         CapacityResource cr = (CapacityResource) namedResourceSet.findResource(candidate);
00257 
00258         candidate.setDefaultRequest(cr.getDefaultRequest());
00259         candidate.setMaxRequest(cr.getMaxRequest());
00260         candidate.setMinRequest(cr.getMinRequest());
00261     }
00262 
00263     private boolean checkCapacityResource(CapacityResource candidate) {
00264         if ((candidate.getRequest() > candidate.getMaxRequest()) ||
00265                 (candidate.getRequest() < candidate.getMinRequest())) {
00266             if (logger.isDebugEnabled()) {
00267                 logger.debug("Error with Capacity: max=" +
00268                     candidate.getMaxRequest() + " min=" +
00269                     candidate.getMinRequest() + " default=" +
00270                     candidate.getDefaultRequest() + " request=" +
00271                     candidate.getRequest());
00272             }
00273 
00274             return false;
00275         }
00276 
00277         return true;
00278     }
00279 
00280     private void setCapacityResource(CapacityResource cr, int request) {
00281         setCapResDefaultMaxMin(cr);
00282         cr.setRequest(request);
00283         if (!checkCapacityResource(cr)) {
00284             System.err.println("Using default " + cr.getClass().getName() +
00285                 " request: " + cr.getDefaultRequest());
00286             cr.setRequest(cr.getDefaultRequest());
00287         }
00288     }
00289 
00290     private Node getNode(int numnodes) {
00291         Node node = new Node();
00292         setCapacityResource(node, numnodes);
00293         return node;
00294     }
00295 
00296     private Processor getProcessor(int numprocessor) {
00297         Processor p = new Processor();
00298         setCapacityResource(p, numprocessor);
00299         return p;
00300     }
00301 
00302     private Memory getMemory(int nummemory) {
00303         Memory mem = new Memory();
00304         setCapacityResource(mem, nummemory);
00305         return mem;
00306     }
00307 
00308     private RunTime getRuntime(int numseconds) {
00309         RunTime rt = new RunTime();
00310         setCapacityResource(rt, numseconds);
00311         return rt;
00312     }
00313 
00314     private Priority getPriority(PriorityValue priValue) {
00315         Priority pri = new Priority();
00316         pri.setValue(priValue);
00317         return pri;
00318     }
00319 
00323     private void buildJob() {
00324         initStaticClientFields(new Boolean(true), uParam.getUnicoreDir(),
00325             new Boolean(false));
00326         initResourceManager(uParam.getKeyFilePath(), uParam.getKeyPassword());
00327 
00328         jc = getNewJob(uParam.getJobName(), uParam.getJobName());
00329     }
00330 
00334     private void buildUsite() {
00335         //************** USITE *********************
00336         Usite us = getNewUsite(uParam.getUsiteUrl(), uParam.getUsiteName(),
00337                 uParam.getUsiteType());
00338 
00339         jc.setUsite(us);
00340     }
00341 
00345     private void buildVsite() {
00346         //*************** VSITE ***********************
00347         ResourceManager.loadVsites(jc.getUsite());
00348         Vsite vs = getVsitebyName(jc.getUsite(), uParam.getVsiteName());
00349         jc.setVsite(vs);
00350 
00351         //*************** USER ************************
00352         User user = ResourceManager.getUser();
00353         jc.setUser(user);
00354     }
00355 
00359     private void buildResources() {
00360         //*************** Requested Resources *********
00361         //Create a new ResourceTray if needed
00362         //Create a new resourceSet encapsulator
00363         namedResourceSet = new NamedResourceSet(
00364                 "ProActive Descriptor Defined Resources");
00365         namedResourceSet.removeAllElements();
00366 
00367         //Add the resource to the NamedResourceSet
00368         Node node = getNode(uParam.getVsiteNodes());
00369         namedResourceSet.add(node);
00370         Processor pro = getProcessor(uParam.getVsiteProcessors());
00371         namedResourceSet.add(pro);
00372         Memory mem = getMemory(uParam.getVsiteMemory());
00373         namedResourceSet.add(mem);
00374         RunTime runtime = getRuntime(uParam.getVsiteRuntime());
00375         namedResourceSet.add(runtime);
00376         Priority pri = getPriority(uParam.getVsitePriority());
00377         namedResourceSet.add(pri);
00378     }
00379 
00384     private void buildScriptTask() {
00385         //*************** Set TASKS *****************
00386         //mv files + command
00387         ScriptContainer sc = addScriptTask("ProActiveTask",
00388                 uParam.getDestMoveCommand() + uParam.getScriptContent());
00389 
00390         // Add file imports
00391         buildImportFiles(sc);
00392 
00393         //Put the NamedresourceSet on the Job resourceTray
00394         ResourceTray resourceTray = jc.getResourceTray();
00395         resourceTray.put(sc.getIdentifier(), namedResourceSet);
00396     }
00397 
00398     private void buildImportFiles(ScriptContainer sc) {
00399         String[] files = uParam.getDeployAllFilesAndDirectories();
00400 
00401         //Add each file to the ScriptContainer
00402         for (int i = 0; i < files.length; i++) {
00403             String[] fileInfo = files[i].split(",");
00404 
00405             //TODO improve the syntax checking
00406             if (fileInfo.length != 2) {
00407                 System.err.println(
00408                     "UnicoreProActiveClient Syntax error Skipping: " +
00409                     files[i]);
00410                 continue;
00411             }
00412 
00413             //Storage, srcName, srcDest, overwrite, isAscii
00414             FileImport fi = new FileImport("Local", fileInfo[0],
00415                     UnicoreParameters.getFileName(fileInfo[1]), true, false);
00416 
00417             sc.addFileImport(fi);
00418         }
00419     }
00420 
00432     public void setScriptContent(String scriptContent) {
00433         if (jobIsBuilt) {
00434             System.err.println("Error Job already built." +
00435                 "ScriptContent change will not affect job");
00436         }
00437         uParam.setScriptContent(scriptContent);
00438     }
00439 
00445     public void build() {
00446         if (jobIsBuilt) {
00447             System.err.println("Error. Job has already been built." +
00448                 "Can not build it again");
00449         }
00450 
00451         buildJob();
00452         buildUsite();
00453         buildVsite();
00454         buildResources();
00455         buildScriptTask();
00456 
00457         jobIsBuilt = true;
00458     }
00459 
00465     public void submitJob() {
00466         if (!uParam.isSubmitJob()) {
00467             return;
00468         }
00469 
00470         if (!jobIsBuilt) {
00471             System.err.println("Error in Unicore submitJob." +
00472                 " Must call buildJob() first. Job not submitted.");
00473             return;
00474         }
00475 
00476         long beginning = System.currentTimeMillis();
00477         long end = beginning;
00478 
00479         SubmitJob submit = new SubmitJob(jc);
00480         submit.start();
00481         while (jc.getState() != ActionContainer.STATE_SUBMITTED) {
00482             try {
00483                 Thread.sleep(1000);
00484             } catch (InterruptedException e) {
00485                 System.err.println("Thread interrupted");
00486                 e.printStackTrace();
00487             }
00488         }
00489 
00490         end = System.currentTimeMillis();
00491 
00492         if (logger.isDebugEnabled()) {
00493             logger.debug("Job submission took:" + (end - beginning) + "[ms]");
00494         }
00495     }
00496 
00504     public void saveJob() {
00505         if (!uParam.isSaveJob()) {
00506             return;
00507         }
00508 
00509         if (!jobIsBuilt) {
00510             System.err.println("Error in Unicore submitJob." +
00511                 " Must call buildJob() first. Job not submitted.");
00512             return;
00513         }
00514 
00515         //              System.out.println(uParam);
00516         if ((jc.getFilename() == null) || (jc.getFilename().length() < 0)) {
00517             System.err.println("Saving job aborted. Filename not configured");
00518             return;
00519         }
00520 
00521         boolean succeeded = ResourceManager.writeObjectToFile(jc,
00522                 jc.getFilename() + ".ajo");
00523 
00524         try {
00525             long timing = System.currentTimeMillis();
00526 
00527             //FileOutputStream f = new FileOutputStream(name);
00528             XMLObjectWriter dout = new XMLObjectWriter(new File(jc.getFilename() +
00529                         ".xml"));
00530             dout.writeObjectXML(jc);
00531 
00532             timing = System.currentTimeMillis() - timing;
00533             System.out.println("Writing job in XML format to file " +
00534                 jc.getFilename() + " in " + timing + " milliseconds");
00535         } catch (Exception e) {
00536             System.out.println("Exception during XML serialization...");
00537             e.printStackTrace();
00538         }
00539     }
00540 
00545     public static void main(String[] args) {
00546 
00547         /*
00548         UnicoreParameters uParam = new UnicoreParameters();
00549 
00550         uParam.setUnicoreDir("/home/mleyton/.unicore");
00551         uParam.setKeyFilePath("/home/mleyton/.unicore/keystore");
00552         uParam.setKeyPassword("testing");
00553         uParam.setJobName("ProActiveClientJob");
00554         uParam.setScriptContent("java -version");
00555         uParam.setUsiteName("Gate Europe");
00556         uParam.setUsiteUrl("http://testgrid.unicorepro.com:4000");
00557         uParam.setUsiteType("CLASSIC");
00558         uParam.setVsiteName("SUPRENUM");
00559 
00560         uParam.setVsiteNodes(1); uParam.setVsiteProcessors(1);
00561         uParam.setVsiteMemory(16); uParam.setVsiteRuntime(300);
00562         uParam.setVsitePriority("high");
00563 
00564         uParam.setSubmitJob(false);
00565         */
00566         UnicoreProActiveClient upc = new UnicoreProActiveClient(parseArgs(args));
00567 
00568         //DEBUG
00569         //System.out.println("After parsing in forked method");
00570         //System.out.println(upc.uParam);
00571         upc.build();
00572         upc.saveJob();
00573         upc.submitJob();
00574         System.exit(0);
00575     }
00576 
00577     public static UnicoreParameters parseArgs(String[] args) {
00578         UnicoreParameters uParam = new UnicoreParameters();
00579 
00580         int i = 0;
00581         int j;
00582         String arg;
00583         String argvalue;
00584         char flag;
00585 
00586         while ((i < args.length) && args[i].startsWith("-")) {
00587             arg = args[i++];
00588 
00589             if ((i >= args.length) || (arg.charAt(0) != '-')) {
00590                 System.err.println(arg + " requires a parameter");
00591                 System.err.println(CLIENTUSAGE);
00592                 System.exit(1);
00593             }
00594             uParam.setParameter(arg, args[i++]);
00595         } //while               
00596 
00597         if (i < args.length) {
00598             StringBuilder sb = new StringBuilder();
00599             while (i < args.length)
00600                 sb.append(args[i++]).append(" ");
00601 
00602             uParam.setScriptContent(sb.toString());
00603         } else {
00604             System.err.println("Missing command");
00605             System.err.println(CLIENTUSAGE);
00606             System.exit(1);
00607         }
00608 
00609         //debug
00610         //System.out.println("UNICORE PROACTIVE CLIENT");
00611         //System.out.println(uParam);
00612         return uParam;
00613     } //parseArgs
00614 }

Generated on Mon Jan 22 15:16:09 2007 for ProActive by  doxygen 1.5.1