Salome HOME
Porting to Mandrake 10.1 and new products:
[modules/kernel.git] / src / Batch / Batch_BatchManager_PBS.cxx
1 /*
2  * BatchManager_PBS.cxx : 
3  *
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
7  * Projet : Salome 2
8  *
9  */
10
11 extern "C" {
12 #include <pbs_error.h>
13 #include <pbs_ifl.h>
14 }
15 #include <iostream>
16 #include <fstream>
17 #include <sstream>
18 //#include "MEDMEM_STRING.hxx"
19 #include "Batch_BatchManager_PBS.hxx"
20 using namespace std;
21
22 namespace Batch {
23
24   // Recupere le nom du serveur par defaut
25 //   string BatchManager_PBS::getDefaultServer() {
26 //     string server_name = "localhost";
27
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();
33 //     }
34
35 //     return server_name;
36 //   }
37
38   // Constructeur
39 //   BatchManager_PBS::BatchManager_PBS() throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(BatchManager_PBS::getDefaultServer())
40 //   {
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 \"";
46 //       msg += _hostname;
47 //       msg += "\" : ";
48 //       msg += errmsg ? errmsg : "Reason unknown";
49 //       throw ConnexionFailureException(msg.c_str());
50 //     }
51 //   }
52
53   // Constructeur
54 //   BatchManager_PBS::BatchManager_PBS(string host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(host)
55 //   {
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 \"";
61 //       msg += _hostname;
62 //       msg += "\" : ";
63 //       msg += errmsg ? errmsg : "Reason unknown";
64 //       throw ConnexionFailureException(msg.c_str());
65 //     }
66 //   }
67   BatchManager_PBS::BatchManager_PBS(const FactBatchManager * parent, const char * host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(parent, host)
68   {
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 \"";
74       msg += _hostname;
75       msg += "\" : ";
76       msg += errmsg ? errmsg : "Reason unknown";
77       throw ConnexionFailureException(msg.c_str());
78     }
79   }
80
81   // Destructeur
82   BatchManager_PBS::~BatchManager_PBS()
83   {
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 \"";
88       msg += _hostname;
89       msg += "\" : ";
90       msg += pbs_geterrmsg(_connect);
91       throw ConnexionFailureException(msg.c_str());
92     }
93   }
94
95   // Methode pour le controle des jobs : soumet un job au gestionnaire
96   const JobId BatchManager_PBS::submitJob(const Job & job)
97   {
98     Job_PBS jobpbs = job;
99     char * ref = pbs_submit(_connect,
100                             jobpbs.getAttributesOP(),
101                             jobpbs.getScript(),
102                             jobpbs.getDestination(),
103                             NULL);
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);
108     }
109
110     JobId id(this, string(ref));
111     free(ref);
112     return id;
113   }
114
115   // Methode pour le controle des jobs : retire un job du gestionnaire
116   void BatchManager_PBS::deleteJob(const JobId & jobid)
117   {
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);
124     }
125   }
126    
127   // Methode pour le controle des jobs : suspend un job en file d'attente
128   void BatchManager_PBS::holdJob(const JobId & jobid)
129   {
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);
136     }
137   }
138
139   // Methode pour le controle des jobs : relache un job suspendu
140   void BatchManager_PBS::releaseJob(const JobId & jobid)
141   {
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);
148     }
149   }
150
151
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)
154   {
155     Job job(param, env);
156     Job_PBS jobpbs(job);
157
158     char * ref = const_cast< char * >(jobid.getReference().c_str());
159     int rc = pbs_alterjob(_connect,
160                           ref,
161                           jobpbs.getAttributes(),
162                           NULL);
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);
167     }
168                 
169   }
170
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)
173   {
174     alterJob(jobid, param, Environnement());
175   }
176
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)
179   {
180     alterJob(jobid, Parametre(), env);
181   }
182
183
184
185   // Methode pour le controle des jobs : renvoie l'etat du job
186   JobInfo BatchManager_PBS::queryJob(const JobId & jobid)
187   {
188     char * id = const_cast< char * >(jobid.getReference().c_str());
189     JobInfo_PBS ji = JobInfo_PBS(pbs_statjob(_connect, id, 0, 0), true);
190     return ji;
191   }
192
193
194
195 }