]> SALOME platform Git repositories - modules/kernel.git/blob - src/Batch/Batch_BatchManager_PBS.cxx
Salome HOME
PR: mergefrom_BR_BATCH_22Oct04
[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
21 namespace Batch {
22
23   // Recupere le nom du serveur par defaut
24 //   string BatchManager_PBS::getDefaultServer() {
25 //     string server_name = "localhost";
26
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();
32 //     }
33
34 //     return server_name;
35 //   }
36
37   // Constructeur
38 //   BatchManager_PBS::BatchManager_PBS() throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(BatchManager_PBS::getDefaultServer())
39 //   {
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 \"";
45 //       msg += _hostname;
46 //       msg += "\" : ";
47 //       msg += errmsg ? errmsg : "Reason unknown";
48 //       throw ConnexionFailureException(msg.c_str());
49 //     }
50 //   }
51
52   // Constructeur
53 //   BatchManager_PBS::BatchManager_PBS(string host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(host)
54 //   {
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 \"";
60 //       msg += _hostname;
61 //       msg += "\" : ";
62 //       msg += errmsg ? errmsg : "Reason unknown";
63 //       throw ConnexionFailureException(msg.c_str());
64 //     }
65 //   }
66   BatchManager_PBS::BatchManager_PBS(const FactBatchManager * parent, const char * host) throw(InvalidArgumentException,ConnexionFailureException) : BatchManager(parent, host)
67   {
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 \"";
73       msg += _hostname;
74       msg += "\" : ";
75       msg += errmsg ? errmsg : "Reason unknown";
76       throw ConnexionFailureException(msg.c_str());
77     }
78   }
79
80   // Destructeur
81   BatchManager_PBS::~BatchManager_PBS()
82   {
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 \"";
87       msg += _hostname;
88       msg += "\" : ";
89       msg += pbs_geterrmsg(_connect);
90       throw ConnexionFailureException(msg.c_str());
91     }
92   }
93
94   // Methode pour le controle des jobs : soumet un job au gestionnaire
95   const JobId BatchManager_PBS::submitJob(const Job & job)
96   {
97     Job_PBS jobpbs = job;
98     char * ref = pbs_submit(_connect,
99                             jobpbs.getAttributesOP(),
100                             jobpbs.getScript(),
101                             jobpbs.getDestination(),
102                             NULL);
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);
107     }
108
109     JobId id(this, string(ref));
110     free(ref);
111     return id;
112   }
113
114   // Methode pour le controle des jobs : retire un job du gestionnaire
115   void BatchManager_PBS::deleteJob(const JobId & jobid)
116   {
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);
123     }
124   }
125    
126   // Methode pour le controle des jobs : suspend un job en file d'attente
127   void BatchManager_PBS::holdJob(const JobId & jobid)
128   {
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);
135     }
136   }
137
138   // Methode pour le controle des jobs : relache un job suspendu
139   void BatchManager_PBS::releaseJob(const JobId & jobid)
140   {
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);
147     }
148   }
149
150
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)
153   {
154     Job job(param, env);
155     Job_PBS jobpbs(job);
156
157     char * ref = const_cast< char * >(jobid.getReference().c_str());
158     int rc = pbs_alterjob(_connect,
159                           ref,
160                           jobpbs.getAttributes(),
161                           NULL);
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);
166     }
167                 
168   }
169
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)
172   {
173     alterJob(jobid, param, Environnement());
174   }
175
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)
178   {
179     alterJob(jobid, Parametre(), env);
180   }
181
182
183
184   // Methode pour le controle des jobs : renvoie l'etat du job
185   JobInfo BatchManager_PBS::queryJob(const JobId & jobid)
186   {
187     char * id = const_cast< char * >(jobid.getReference().c_str());
188     JobInfo_PBS ji = JobInfo_PBS(pbs_statjob(_connect, id, 0, 0), true);
189     return ji;
190   }
191
192
193
194 }