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"
23 // Recupere le nom du serveur par defaut
24 // string BatchManager_PBS::getDefaultServer() {
25 // string server_name = "localhost";
27 // const char * server_name_path = "@openpbsspooldir@/server_name";
28 // ifstream server_name_file(server_name_path);
29 // if (server_name_file) {
30 // server_name_file >> server_name;
31 // server_name_file.close();
34 // return server_name;
38 // BatchManager_PBS::BatchManager_PBS() throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(BatchManager_PBS::getDefaultServer())
40 // // On se connecte au serveur PBS
41 // _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
42 // if (_connect < 0) { // si erreur
43 // char * errmsg = pbs_geterrmsg(_connect);
44 // string msg = "PBS Server on host \"";
47 // msg += errmsg ? errmsg : "Reason unknown";
48 // throw ConnexionFailureException(msg.c_str());
53 // BatchManager_PBS::BatchManager_PBS(string host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(host)
55 // // On se connecte au serveur PBS
56 // _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
57 // if (_connect < 0) { // si erreur
58 // char * errmsg = pbs_geterrmsg(_connect);
59 // string msg = "PBS Server on host \"";
62 // msg += errmsg ? errmsg : "Reason unknown";
63 // throw ConnexionFailureException(msg.c_str());
66 BatchManager_PBS::BatchManager_PBS(const FactBatchManager * parent, const char * host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(parent, host)
68 // On se connecte au serveur PBS
69 _connect = pbs_connect(const_cast< char * >(_hostname.c_str()));
70 if (_connect < 0) { // si erreur
71 char * errmsg = pbs_geterrmsg(_connect);
72 string msg = "PBS Server on host \"";
75 msg += errmsg ? errmsg : "Reason unknown";
76 throw ConnexionFailureException(msg.c_str());
81 BatchManager_PBS::~BatchManager_PBS()
83 // On se deconnecte du serveur PBS
84 int rc = pbs_disconnect(_connect);
85 if (rc < 0) { // si erreur
86 string msg = "PBS Server on host \"";
89 msg += pbs_geterrmsg(_connect);
90 throw ConnexionFailureException(msg.c_str());
94 // Methode pour le controle des jobs : soumet un job au gestionnaire
95 const JobId BatchManager_PBS::submitJob(const Job & job)
98 char * ref = pbs_submit(_connect,
99 jobpbs.getAttributesOP(),
101 jobpbs.getDestination(),
103 if (!ref) { // si erreur
104 char * msg = pbs_geterrmsg(_connect);
105 if (!msg) msg = "unknown";
106 throw APIInternalFailureException(string("PBS submit error. Reason : ") + msg);
109 JobId id(this, string(ref));
114 // Methode pour le controle des jobs : retire un job du gestionnaire
115 void BatchManager_PBS::deleteJob(const JobId & jobid)
117 char * ref = const_cast< char * >(jobid.getReference().c_str());
118 int rc = pbs_deljob(_connect, ref, 0);
119 if (rc) { // si erreur
120 char * msg = pbs_geterrmsg(_connect);
121 if (!msg) msg = "unknown";
122 throw APIInternalFailureException(string("PBS deljob error. Reason : ") + msg);
126 // Methode pour le controle des jobs : suspend un job en file d'attente
127 void BatchManager_PBS::holdJob(const JobId & jobid)
129 char * ref = const_cast< char * >(jobid.getReference().c_str());
130 int rc = pbs_holdjob(_connect, ref, USER_HOLD, 0);
131 if (rc) { // si erreur
132 char * msg = pbs_geterrmsg(_connect);
133 if (!msg) msg = "unknown";
134 throw APIInternalFailureException(string("PBS holdjob error. Reason : ") + msg);
138 // Methode pour le controle des jobs : relache un job suspendu
139 void BatchManager_PBS::releaseJob(const JobId & jobid)
141 char * ref = const_cast< char * >(jobid.getReference().c_str());
142 int rc = pbs_rlsjob(_connect, ref, USER_HOLD, 0);
143 if (rc) { // si erreur
144 char * msg = pbs_geterrmsg(_connect);
145 if (!msg) msg = "unknown";
146 throw APIInternalFailureException(string("PBS rlsjob error. Reason : ") + msg);
151 // Methode pour le controle des jobs : modifie un job en file d'attente
152 void BatchManager_PBS::alterJob(const JobId & jobid, const Parametre & param, const Environnement & env)
157 char * ref = const_cast< char * >(jobid.getReference().c_str());
158 int rc = pbs_alterjob(_connect,
160 jobpbs.getAttributes(),
162 if (rc) { // si erreur
163 char * msg = pbs_geterrmsg(_connect);
164 if (!msg) msg = "unknown";
165 throw APIInternalFailureException(string("PBS alterjob error. Reason : ") + msg);
170 // Methode pour le controle des jobs : modifie un job en file d'attente
171 void BatchManager_PBS::alterJob(const JobId & jobid, const Parametre & param)
173 alterJob(jobid, param, Environnement());
176 // Methode pour le controle des jobs : modifie un job en file d'attente
177 void BatchManager_PBS::alterJob(const JobId & jobid, const Environnement & env)
179 alterJob(jobid, Parametre(), env);
184 // Methode pour le controle des jobs : renvoie l'etat du job
185 JobInfo BatchManager_PBS::queryJob(const JobId & jobid)
187 char * id = const_cast< char * >(jobid.getReference().c_str());
188 JobInfo_PBS ji = JobInfo_PBS(pbs_statjob(_connect, id, 0, 0), true);