2 * BatchManager_PBS.cxx :
4 * Auteur : Ivan DUTKA-MALEN - EDF R&D
5 * Mail : mailto:ivan.dutka-malen@der.edf.fr
6 * Date : Thu Nov 6 10:17:22 2003
12 #include <pbs_error.h>
18 //#include "MEDMEM_STRING.hxx"
19 #include "Batch_BatchManager_PBS.hxx"
24 // Recupere le nom du serveur par defaut
25 // string BatchManager_PBS::getDefaultServer() {
26 // string server_name = "localhost";
28 // const char * server_name_path = "@openpbsspooldir@/server_name";
29 // ifstream server_name_file(server_name_path);
30 // if (server_name_file) {
31 // server_name_file >> server_name;
32 // server_name_file.close();
35 // return server_name;
39 // BatchManager_PBS::BatchManager_PBS() throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(BatchManager_PBS::getDefaultServer())
41 // // On se connecte au serveur PBS
42 // _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
43 // if (_connect < 0) { // si erreur
44 // char * errmsg = pbs_geterrmsg(_connect);
45 // string msg = "PBS Server on host \"";
48 // msg += errmsg ? errmsg : "Reason unknown";
49 // throw ConnexionFailureException(msg.c_str());
54 // BatchManager_PBS::BatchManager_PBS(string host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(host)
56 // // On se connecte au serveur PBS
57 // _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
58 // if (_connect < 0) { // si erreur
59 // char * errmsg = pbs_geterrmsg(_connect);
60 // string msg = "PBS Server on host \"";
63 // msg += errmsg ? errmsg : "Reason unknown";
64 // throw ConnexionFailureException(msg.c_str());
67 BatchManager_PBS::BatchManager_PBS(const FactBatchManager * parent, const char * host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(parent, host)
69 // On se connecte au serveur PBS
70 _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
71 if (_connect < 0) { // si erreur
72 char * errmsg = pbs_geterrmsg(_connect);
73 string msg = "PBS Server on host \"";
76 msg += errmsg ? errmsg : "Reason unknown";
77 throw ConnexionFailureException(msg.c_str());
82 BatchManager_PBS::~BatchManager_PBS()
84 // On se deconnecte du serveur PBS
85 int rc = pbs_disconnect(_connect);
86 if (rc < 0) { // si erreur
87 string msg = "PBS Server on host \"";
90 msg += pbs_geterrmsg(_connect);
91 throw ConnexionFailureException(msg.c_str());
95 // Methode pour le controle des jobs : soumet un job au gestionnaire
96 const JobId BatchManager_PBS::submitJob(const Job & job)
99 char * ref = pbs_submit(_connect,
100 jobpbs.getAttributesOP(),
102 jobpbs.getDestination(),
104 if (!ref) { // si erreur
105 char * msg = pbs_geterrmsg(_connect);
106 if (!msg) msg = "unknown";
107 throw APIInternalFailureException(string("PBS submit error. Reason : ") + msg);
110 JobId id(this, string(ref));
115 // Methode pour le controle des jobs : retire un job du gestionnaire
116 void BatchManager_PBS::deleteJob(const JobId & jobid)
118 char * ref = const_cast< char * >(jobid.getReference().c_str());
119 int rc = pbs_deljob(_connect, ref, 0);
120 if (rc) { // si erreur
121 char * msg = pbs_geterrmsg(_connect);
122 if (!msg) msg = "unknown";
123 throw APIInternalFailureException(string("PBS deljob error. Reason : ") + msg);
127 // Methode pour le controle des jobs : suspend un job en file d'attente
128 void BatchManager_PBS::holdJob(const JobId & jobid)
130 char * ref = const_cast< char * >(jobid.getReference().c_str());
131 int rc = pbs_holdjob(_connect, ref, USER_HOLD, 0);
132 if (rc) { // si erreur
133 char * msg = pbs_geterrmsg(_connect);
134 if (!msg) msg = "unknown";
135 throw APIInternalFailureException(string("PBS holdjob error. Reason : ") + msg);
139 // Methode pour le controle des jobs : relache un job suspendu
140 void BatchManager_PBS::releaseJob(const JobId & jobid)
142 char * ref = const_cast< char * >(jobid.getReference().c_str());
143 int rc = pbs_rlsjob(_connect, ref, USER_HOLD, 0);
144 if (rc) { // si erreur
145 char * msg = pbs_geterrmsg(_connect);
146 if (!msg) msg = "unknown";
147 throw APIInternalFailureException(string("PBS rlsjob error. Reason : ") + msg);
152 // Methode pour le controle des jobs : modifie un job en file d'attente
153 void BatchManager_PBS::alterJob(const JobId & jobid, const Parametre & param, const Environnement & env)
158 char * ref = const_cast< char * >(jobid.getReference().c_str());
159 int rc = pbs_alterjob(_connect,
161 jobpbs.getAttributes(),
163 if (rc) { // si erreur
164 char * msg = pbs_geterrmsg(_connect);
165 if (!msg) msg = "unknown";
166 throw APIInternalFailureException(string("PBS alterjob error. Reason : ") + msg);
171 // Methode pour le controle des jobs : modifie un job en file d'attente
172 void BatchManager_PBS::alterJob(const JobId & jobid, const Parametre & param)
174 alterJob(jobid, param, Environnement());
177 // Methode pour le controle des jobs : modifie un job en file d'attente
178 void BatchManager_PBS::alterJob(const JobId & jobid, const Environnement & env)
180 alterJob(jobid, Parametre(), env);
185 // Methode pour le controle des jobs : renvoie l'etat du job
186 JobInfo BatchManager_PBS::queryJob(const JobId & jobid)
188 char * id = const_cast< char * >(jobid.getReference().c_str());
189 JobInfo_PBS ji = JobInfo_PBS(pbs_statjob(_connect, id, 0, 0), true);