Salome HOME
[Bug PAL7900] g++ 3.3 compatibility
[modules/yacs.git] / src / Batch / Batch_JobInfo_LSF.cxx
1 /*
2  * JobInfo_LSF.cxx : 
3  *
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
7  * Projet : Salome 2
8  *
9  */
10
11 #include <cstdio>
12 #include <sstream>
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"
18
19 namespace Batch {
20
21
22
23   // Constructeurs
24   JobInfo_LSF::JobInfo_LSF(int id) : JobInfo()
25   {
26     struct loadIndexLog * p_ld        = new struct loadIndexLog;
27     struct jobInfoHead  * p_jInfoHead = lsb_openjobinfo_a(id, NULL, NULL, NULL, NULL, ALL_JOB);
28
29     int more = p_jInfoHead->numJobs;
30     if (more != 1) {
31       char * msg = lsb_sysmsg();
32       if (!msg) msg = "unknown";
33       throw APIInternalFailureException(string("LSF lsb_openjobinfo error. Reason : ") + msg);     
34     }
35
36     // on remplit une structure contenant <more> elements
37     struct jobInfoEnt & jobInfo = * lsb_readjobinfo(&more);
38
39
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,
66                                                                    jobInfo.reasonTb, 
67                                                                    p_jInfoHead,
68                                                                    p_ld) : "";
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;
75
76
77     ostringstream oss;
78     int jobid = jobInfo.jobId;
79     oss << jobid;
80     _param[ID] = oss.str();
81
82
83     string hosts, sep;
84     for(int i=0; i < jobInfo.numExHosts; i++, sep="+") {
85       hosts += jobInfo.exHosts[i];
86       hosts += sep;
87     }
88     _param[EXECUTIONHOST]    = hosts;
89
90     ostringstream status;
91
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;";
104
105     _param[STATE] = status.str();
106     _running = IS_FINISH(jobInfo.status) ? false : true;
107
108
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");
115
116     for(int i=0; i < jobInfo.submit.nxf; i++) {
117       switch (jobInfo.submit.xf[i].options) {
118       case XF_OP_SUB2EXEC:
119         _param[INFILE]  += Couple(jobInfo.submit.xf[i].subFn, jobInfo.submit.xf[i].execFn);
120         break;
121
122       case XF_OP_EXEC2SUB:
123         _param[OUTFILE] += Couple(jobInfo.submit.xf[i].subFn, jobInfo.submit.xf[i].execFn);
124         break;
125
126       default:
127         break;
128       }
129     }
130
131
132     lsb_closejobinfo();
133     delete p_ld;
134   }
135
136
137
138     // Teste si un job est present en machine
139   bool JobInfo_LSF::isRunning() const
140   {
141     return _running;
142   }
143
144
145   // Destructeur
146   JobInfo_LSF::~JobInfo_LSF()
147   {
148     // Nothing to do
149   }
150
151
152   
153   // Convertit une date HH:MM:SS en secondes
154   long JobInfo_LSF::HMStoLong(const string & s)
155   {
156     long hour, min, sec;
157
158     sscanf( s.c_str(), "%ld:%ld:%ld", &hour, &min, &sec);
159     return ( ( ( hour * 60L ) + min ) * 60L ) + sec;
160   }
161
162   // Methode pour l'interfacage avec Python (SWIG) : affichage en Python
163   string JobInfo_LSF::__str__() const
164   {
165     ostringstream sst;
166     sst << "<JobInfo_LSF (" << this << ") :" << endl;
167     sst << " ID = " <<_param[ID] << endl;
168
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;
174       }
175     }
176     return sst.str();
177   }
178
179
180 }