4 * Auteur : Ivan DUTKA-MALEN - EDF R&D
5 * Mail : mailto:ivan.dutka-malen@der.edf.fr
6 * Date : Fri Nov 21 09:42:06 2003
13 #include "Batch_Parametre.hxx"
14 #include "Batch_Environnement.hxx"
15 #include "Batch_RunTimeException.hxx"
16 #include "Batch_APIInternalFailureException.hxx"
17 #include "Batch_JobInfo_LSF.hxx"
24 JobInfo_LSF::JobInfo_LSF(int id) : JobInfo()
26 struct loadIndexLog * p_ld = new struct loadIndexLog;
27 struct jobInfoHead * p_jInfoHead = lsb_openjobinfo_a(id, NULL, NULL, NULL, NULL, ALL_JOB);
29 int more = p_jInfoHead->numJobs;
31 char * msg = lsb_sysmsg();
32 if (!msg) msg = "unknown";
33 throw APIInternalFailureException(string("LSF lsb_openjobinfo error. Reason : ") + msg);
36 // on remplit une structure contenant <more> elements
37 struct jobInfoEnt & jobInfo = * lsb_readjobinfo(&more);
40 // On remplit les membres _param et _env
41 _param[ACCOUNT] = jobInfo.submit.projectName;
42 _param[CHECKPOINT] = jobInfo.submit.chkpntPeriod != 0;
43 _param[CKPTINTERVAL] = jobInfo.submit.chkpntPeriod;
44 _param[CREATIONTIME] = jobInfo.submitTime;
45 // _param[EGROUP] = jobInfo.;
46 _param[ELIGIBLETIME] = jobInfo.reserveTime;
47 _param[ENDTIME] = jobInfo.endTime;
48 _param[EUSER] = jobInfo.execUsername;
49 _param[EXECUTABLE] = jobInfo.submit.command;
50 _param[EXITCODE] = jobInfo.exitStatus;
51 _param[HOLD] = jobInfo.status & (JOB_STAT_PSUSP | JOB_STAT_SSUSP | JOB_STAT_USUSP);
52 _param[MAIL] = jobInfo.submit.mailUser;
53 _param[MAXCPUTIME] = jobInfo.submit.rLimits[LSF_RLIMIT_CPU];
54 _param[MAXDISKSIZE] = jobInfo.submit.rLimits[LSF_RLIMIT_FSIZE];
55 _param[MAXRAMSIZE] = jobInfo.submit.rLimits[LSF_RLIMIT_SWAP];
56 _param[MAXWALLTIME] = jobInfo.submit.rLimits[LSF_RLIMIT_RUN];
57 _param[MODIFICATIONTIME] = jobInfo.lastEvent;
58 _param[NAME] = jobInfo.jName;
59 _param[NBPROC] = jobInfo.submit.numProcessors;
60 _param[PID] = jobInfo.jobPid;
61 _param[QUEUE] = jobInfo.submit.queue;
62 _param[QUEUEDTIME] = jobInfo.submitTime;
63 // _param[SERVER] = jobInfo.;
64 _param[STARTTIME] = jobInfo.startTime;
65 _param[TEXT] = jobInfo.numReasons ? lsb_pendreason(jobInfo.numReasons,
69 // _param[TMPDIR] = jobInfo.;
70 _param[USEDCPUTIME] = static_cast<long>(jobInfo.cpuTime);
71 // _param[USEDDISKSIZE] = jobInfo.;
72 _param[USEDRAMSIZE] = jobInfo.runRusage.mem;
73 _param[USEDWALLTIME] = jobInfo.duration * 60L;
74 _param[USER] = jobInfo.user;
78 int jobid = jobInfo.jobId;
80 _param[ID] = oss.str();
84 for(int i=0; i < jobInfo.numExHosts; i++, sep="+") {
85 hosts += jobInfo.exHosts[i];
88 _param[EXECUTIONHOST] = hosts;
92 if (IS_PEND(jobInfo.status))
93 status << " Job is pending;";
94 if (IS_START(jobInfo.status))
95 status << " Job is started;";
96 if (IS_FINISH(jobInfo.status))
97 status << " Job is finished;";
98 if (IS_SUSP(jobInfo.status))
99 status << " Job is suspended;";
100 if (IS_POST_DONE(jobInfo.status))
101 status << " Job is post-done;";
102 if (IS_POST_ERR(jobInfo.status))
103 status << " Job is post-error;";
105 _param[STATE] = status.str();
106 _running = IS_FINISH(jobInfo.status) ? false : true;
109 if (strlen(jobInfo.submit.inFile))
110 _param[INFILE] += Couple(jobInfo.submit.inFile, "stdin");
111 if (strlen(jobInfo.submit.outFile))
112 _param[OUTFILE] += Couple(jobInfo.submit.outFile, "stdout");
113 if (strlen(jobInfo.submit.errFile))
114 _param[OUTFILE] += Couple(jobInfo.submit.errFile, "stderr");
116 for(int i=0; i < jobInfo.submit.nxf; i++) {
117 switch (jobInfo.submit.xf[i].options) {
119 _param[INFILE] += Couple(jobInfo.submit.xf[i].subFn, jobInfo.submit.xf[i].execFn);
123 _param[OUTFILE] += Couple(jobInfo.submit.xf[i].subFn, jobInfo.submit.xf[i].execFn);
138 // Teste si un job est present en machine
139 bool JobInfo_LSF::isRunning() const
146 JobInfo_LSF::~JobInfo_LSF()
153 // Convertit une date HH:MM:SS en secondes
154 long JobInfo_LSF::HMStoLong(const string & s)
158 sscanf( s.c_str(), "%ld:%ld:%ld", &hour, &min, &sec);
159 return ( ( ( hour * 60L ) + min ) * 60L ) + sec;
162 // Methode pour l'interfacage avec Python (SWIG) : affichage en Python
163 string JobInfo_LSF::__str__() const
166 sst << "<JobInfo_LSF (" << this << ") :" << endl;
167 sst << " ID = " <<_param[ID] << endl;
169 sst << " + Parametre :" << endl;
170 Parametre::const_iterator itp;
171 for(itp=_param.begin(); itp!=_param.end(); itp++) {
172 if ( (*itp).first != ID ) {
173 sst << " * " << (*itp).first << " = " << (*itp).second << endl;