00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
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
00094
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
00129 fNoGui.set(null, noGui);
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
00213 jc.setName(name);
00214 jc.setFilename(filename);
00215 jc.setIgnoreFailure(false);
00216
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
00336 Usite us = getNewUsite(uParam.getUsiteUrl(), uParam.getUsiteName(),
00337 uParam.getUsiteType());
00338
00339 jc.setUsite(us);
00340 }
00341
00345 private void buildVsite() {
00346
00347 ResourceManager.loadVsites(jc.getUsite());
00348 Vsite vs = getVsitebyName(jc.getUsite(), uParam.getVsiteName());
00349 jc.setVsite(vs);
00350
00351
00352 User user = ResourceManager.getUser();
00353 jc.setUser(user);
00354 }
00355
00359 private void buildResources() {
00360
00361
00362
00363 namedResourceSet = new NamedResourceSet(
00364 "ProActive Descriptor Defined Resources");
00365 namedResourceSet.removeAllElements();
00366
00367
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
00386
00387 ScriptContainer sc = addScriptTask("ProActiveTask",
00388 uParam.getDestMoveCommand() + uParam.getScriptContent());
00389
00390
00391 buildImportFiles(sc);
00392
00393
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
00402 for (int i = 0; i < files.length; i++) {
00403 String[] fileInfo = files[i].split(",");
00404
00405
00406 if (fileInfo.length != 2) {
00407 System.err.println(
00408 "UnicoreProActiveClient Syntax error Skipping: " +
00409 files[i]);
00410 continue;
00411 }
00412
00413
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
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
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
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566 UnicoreProActiveClient upc = new UnicoreProActiveClient(parseArgs(args));
00567
00568
00569
00570
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 }
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
00610
00611
00612 return uParam;
00613 }
00614 }