1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 import os
84 import sys
85 from ctypes import *
86
88
90 """
91 Load the library whereever it may be.
92 """
93
94 if 'PBSLIB' in os.environ:
95 file = os.environ['PBSLIB']
96 if not os.path.isfile(file):
97 raise TorqueLibError, \
98 "PBS library PBSLIB=%s does not exist"%(file)
99 files = [file]
100 else:
101 files = []
102
103
104 filedir = os.path.dirname(__file__)
105 if sys.platform in ('win32','cygwin'):
106 files += [filedir+"/libtorque.dll"]
107 else:
108 if sys.platform in ('darwin'):
109 lib = 'libtorque.dylib'
110 ldenv = 'DYLD_LIBRARY_PATH'
111 else:
112 lib = 'libtorque.so'
113 ldenv = 'LD_LIBRARY_PATH'
114
115 ldpath = [p for p in os.environ.get(ldenv,'').split(':') if p != '']
116 stdpath = [ '/usr/local/lib', '/usr/lib']
117 files += [os.path.join(p,lib) for p in [filedir]+ldpath+stdpath]
118
119
120 for file in files:
121 if not os.path.isfile(file): continue
122 try:
123 return cdll[file]
124 except:
125 raise TorqueLibError, \
126 "PBS library %s could not be loaded: %s"%(file,sys.exc_info()[0])
127 raise TorqueLibError, "PBS library missing; set PBSLIB or move it to one of:\n %s"%("\n ".join(files))
128
129
130 torque = find_torque()
131
132
133
134
135 -class attrl(Structure): pass
136 attrl._fields_ = [("next",POINTER(attrl)),
137 ("name",c_char_p),
138 ("resouce",c_char_p),
139 ("value", c_char_p),
140 ("batch_op", c_int),
141 ]
142 attropl = attrl
143
145 batch_status._fields_ = [("next",POINTER(batch_status)),
146 ("name",c_char_p),
147 ("attribs",POINTER(attrl)),
148 ("text",c_char_p),
149 ]
150
152 (SET,UNSET,INCR,DECR,
153 EQ,NE,GE,GT,LE,LT,
154 DFLT) = [c_int(i) for i in range(11)]
156 return getattr(self, name.upper())
157
158
159
160 ATTR_user = [
161 "Execution_Time",
162 "Checkpoint",
163 "Error_Path",
164 "group_list",
165 "Hold_Types",
166 "Join_Path",
167 "Keep_Files",
168 "Resource_List",
169 "Mail_Points",
170 "Output_Path",
171 "Priority",
172 "destination",
173 "Rerunable",
174 "job_array_request",
175 "job_array_id",
176 "User_List",
177 "Variable_List",
178 "Account_Name",
179 "Mail_Users",
180 "Job_Name",
181 "Shell_Path_List",
182 "depend",
183 "interactive",
184 "stagein",
185 "stageout",
186 ]
187
188
189 ATTR_job = [
190 "ctime",
191 "exec_host",
192 "mtime",
193 "qtime",
194 "session_id",
195 "euser",
196 "egroup",
197 "hashname",
198 "hop_count",
199 "security",
200 "sched_hint",
201 "substate",
202 "Job_Name",
203 "Job_Owner",
204 "resources_used",
205 "job_state",
206 "queue",
207 "server",
208 "max_running",
209 "max_report",
210 "total_jobs",
211 "comment",
212 "cookie",
213 "queue_rank",
214 "alt_id",
215 "etime",
216 "exit_status",
217 "forward_x11",
218 "submit_args",
219 "tokens",
220 "net_counter",
221 "umask",
222 "start_time",
223 "start_count",
224 "checkpoint_dir",
225 "checkpoint_name",
226 ]
227
228
229 ATTR_queue = [
230 "acl_group_enable",
231 "acl_groups",
232 "acl_host_enable",
233 "acl_hosts",
234 "acl_user_enable",
235 "acl_users",
236 "alt_router",
237 "checkpoint_min",
238 "enabled",
239 "from_route_only",
240 "hostlist",
241 "kill_delay",
242 "max_group_run",
243 "max_queuable",
244 "max_user_queuable",
245 "max_user_run",
246 "queue_type",
247 "resources_assigned",
248 "resources_default",
249 "resources_max",
250 "resources_min",
251 "restartable",
252 "rendezvous_retry",
253 "route_destinations",
254 "route_held_jobs",
255 "route_waiting_jobs",
256 "route_retry_time",
257 "route_lifetime",
258 "reserved_expedite",
259 "reserved_sync",
260 "started",
261 "state_count",
262 "number_jobs",
263 "acl_logic_or",
264 "acl_group_sloppy",
265 "keep_completed",
266 "disallowed_types",
267 ]
268
269
270
271
272
273
274
275
276
277
278 ATTR_server = [
279 "acl_roots",
280 "managers",
281 "default_queue",
282 "default_node",
283 "location_servers",
284 "log_events",
285 "log_file",
286 "log_level",
287 "mail_from",
288 "node_pack",
289 "node_suffix",
290 "operators",
291 "query_other_jobs",
292 "resources_cost",
293 "resources_available",
294 "scheduler_iteration",
295 "scheduling",
296 "server_state",
297 "system_cost",
298 "node_ping_rate",
299 "node_check_rate",
300 "tcp_timeout",
301 "job_stat_rate",
302 "poll_jobs",
303 "down_on_error",
304 "disable_server_id_check",
305 "job_nanny",
306 "owner_purge",
307 "queue_centric_limits",
308 "mom_job_sync",
309 "mail_domain",
310 "pbs_version",
311 "submit_hosts",
312 "allow_node_submit",
313 "allow_proxy_user",
314 "auto_node_np",
315 "server_name",
316 "log_file_max_size",
317 "log_file_roll_depth",
318 "next_job_number",
319 "extra_resc",
320 "sched_version",
321 ]
322
323
324 ATTR_node = [
325 "state",
326 "np",
327 "properties",
328 "ntype",
329 "jobs",
330 "status",
331 "note",
332 ]
333
334
335
336
337 CHECKPOINT_UNSPECIFIED="u"
338 NO_HOLD="n"
339 NO_JOIN="n"
340 NO_KEEP="n"
341 MAIL_AT_ABORT="a"
342
343
344 DELDELAY = "deldelay="
345 DELPURGE = "delpurge="
346 EXECQUEONLY = "exec_queue_only"
347 RERUNFORCE = "force"
348
349 USER_HOLD = "u"
350 OTHER_HOLD = "o"
351 SYSTEM_HOLD = "s"
352
353
354 ND = [
355 "free",
356 "offline",
357 "down",
358 "reserve",
359 "job-exclusive",
360 "job-sharing",
361 "busy",
362 "state-unknown",
363 "time-shared",
364 "cluster",
365 ]
366
367
368 Q_DT = [
369 "batch",
370 "interactive",
371 "rerunable",
372 "nonrerunable",
373 ]
374
375
376 MAX_ENCODE_BFR = 100
377
378 MGR_CMD_CREATE = 0
379 MGR_CMD_DELETE = 1
380 MGR_CMD_SET = 2
381 MGR_CMD_UNSET = 3
382 MGR_CMD_LIST = 4
383 MGR_CMD_PRINT = 5
384 MGR_CMD_ACTIVE = 6
385
386 MGR_OBJ_NONE = -1
387 MGR_OBJ_SERVER = 0
388 MGR_OBJ_QUEUE = 1
389 MGR_OBJ_JOB = 2
390 MGR_OBJ_NODE = 3
391
392
393
394 MSG_OUT = 1
395 MSG_ERR = 2
396
397 SHUT_SIG = -1
398 SHUT_IMMEDIATE = 0
399 SHUT_DELAY = 1
400 SHUT_QUICK = 2
401
402 SIG_RESUME = "resume"
403 SIG_SUSPEND = "suspend"
404
405 PBS_MAXHOSTNAME = 64
406 MAXPATHLEN = 1024
407 MAXNAMLEN = 255
408 MAX_NOTE = 256
409 MAX_NOTE_STR = "256"
410
411 PBS_MAXUSER = 16
412 PBS_MAXGRPN = 16
413 PBS_MAXQUEUENAME = 15
414 PBS_MAXSERVERNAME = PBS_MAXHOSTNAME
415 PBS_MAXJOBARRAYLEN = 6
416 PBS_MAXSEQNUM = 8
417 PBS_MAXPORTNUM = 5
418 PBS_MAXJOBARRAY = 99999
419 PBS_MAXSVRJOBID = (PBS_MAXSEQNUM + PBS_MAXSERVERNAME + PBS_MAXPORTNUM + PBS_MAXJOBARRAYLEN + 2 )
420 PBS_MAXCLTJOBID = (PBS_MAXSVRJOBID + PBS_MAXSERVERNAME + PBS_MAXPORTNUM + PBS_MAXJOBARRAYLEN + 2)
421 PBS_MAXDEST = 1024
422 PBS_MAXROUTEDEST = (PBS_MAXQUEUENAME + PBS_MAXSERVERNAME + PBS_MAXPORTNUM + 2)
423 PBS_USE_IFF = 1
424 PBS_INTERACTIVE = 1
425 PBS_TERM_BUF_SZ = 80
426 PBS_TERM_CCA = 6
427
428
429
430
431
432
433
434
435
436
437
438 PBS_QS_VERSION = 0x00020300
439
440
441
442
443 PBS_BATCH_SERVICE_NAME = "pbs"
444 PBS_BATCH_SERVICE_PORT = 15001
445 PBS_BATCH_SERVICE_NAME_DIS = "pbs_dis"
446 PBS_BATCH_SERVICE_PORT_DIS = 15001
447 PBS_MOM_SERVICE_NAME = "pbs_mom"
448 PBS_MOM_SERVICE_PORT = 15002
449 PBS_MANAGER_SERVICE_NAME = "pbs_resmon"
450 PBS_MANAGER_SERVICE_PORT = 15003
451 PBS_SCHEDULER_SERVICE_NAME = "pbs_sched"
452 PBS_SCHEDULER_SERVICE_PORT = 15004
453
454
455 resource_t = c_int
456
457 RESOURCE_T_NULL = resource_t(0)
458 RESOURCE_T_ALL = resource_t(-1)
459
460
461 _pbs_errno = c_int.in_dll(torque, "pbs_errno")
463
464
465
466 avail = torque.avail
467 avail.restype = c_char_p
468 avail.argtypes = [c_int,c_char_p]
469
470
471
472 pbs_asyrunjob = torque.pbs_asyrunjob
473 pbs_asyrunjob.argtypes = [c_int, c_char_p, c_char_p, c_char_p]
474
475
476 pbs_runjob = torque.pbs_runjob
477 pbs_runjob.argtypes = [c_int, c_char_p, c_char_p, c_char_p]
478
479
480 pbs_alterjob = torque.pbs_alterjob
481 pbs_alterjob.argtypes = [c_int, c_char_p, POINTER(attrl), c_char_p]
482
483
484 pbs_connect = torque.pbs_connect
485 pbs_connect.argtypes = [c_char_p]
486
487
488 pbs_query_max_connections = torque.pbs_query_max_connections
489 pbs_query_max_connections.argtypes = []
490
491
492 pbs_default = torque.pbs_default
493 pbs_default.argtypes = []
494
495
496
497 pbs_strerror = torque.pbs_strerror
498 pbs_strerror.restype = c_char_p
499 pbs_strerror.argtypes = [c_int]
500
501
502 pbs_deljob = torque.pbs_deljob
503 pbs_deljob.argtypes = [c_int, c_char_p, c_char_p]
504
505
506 pbs_disconnect = torque.pbs_disconnect
507 pbs_disconnect.argtypes = [c_int]
508
509
510
511
512 pbs_submit = torque.pbs_submit
513 pbs_submit.restype = c_char_p
514 pbs_submit.argtypes = [c_int, POINTER(attropl), c_char_p, c_char_p, c_char_p]
515
516
517
518 _ = """
519 extern char *pbs_geterrmsg(int connect)
520 extern int pbs_holdjob(int connect,char *job_id,char *hold_type,char *extend)
521 extern char *pbs_locjob(int connect,char *job_id,char *extend)
522
523 extern char *pbs_fbserver(void)
524 extern int csv_length( char *str )
525 extern char *csv_nth( char *str, int n )
526 extern char *pbs_get_server_list(void)
527
528 extern int
529 pbs_manager (int connect, int command, int obj_type, char *obj_name,
530 struct attropl *attrib, char *extend);
531
532 extern int
533 pbs_movejob(int connect, char *job_id, char *destination, char *extend)
534
535 extern int
536 pbs_msgjob (int connect, char *job_id, int file, char *message,
537 char *extend);
538
539 extern int
540 pbs_orderjob(int connect, char *job1, char *job2, char *extend)
541
542 extern int
543 pbs_rescquery (int connect, char **rlist, int nresc, int *avail,
544 int *alloc, int *resv, int *down);
545
546 extern int
547 pbs_rescreserve(int connect, char **rlist, int nresc, resource_t *phandle)
548
549 extern int
550 pbs_rescrelease(int connect, resource_t rhandle)
551
552 extern int
553 pbs_rerunjob(int connect, char *job_id, char *extend)
554
555 extern int
556 pbs_rlsjob(int connect, char *job_id, char *hold_type, char *extend)
557
558 extern char **
559 pbs_selectjob(int connect, struct attropl *select_list, char *extend)
560
561 extern int
562 pbs_sigjob(int connect, char *job_id, char *signal, char *extend)
563
564 extern void
565 pbs_statfree( struct batch_status *stat )
566
567 extern struct batch_status *
568 pbs_statdest(int connect, char *id, char *extend)
569
570 extern struct batch_status *
571 pbs_statjob(int connect, char *id, struct attrl *attrib, char *extend)
572
573 extern struct batch_status *
574 pbs_selstat(int connect, struct attropl *select_list, char *extend)
575
576 extern struct batch_status *
577 pbs_statque(int connect, char *id, struct attrl *attrib, char *extend)
578
579 extern struct batch_status *
580 pbs_statserver(int connect, struct attrl *attrib, char *extend)
581
582 extern struct batch_status *
583 pbs_statnode(int connect, char *id, struct attrl *attrib, char *extend)
584
585 extern int
586 pbs_terminate(int connect, int manner, char *extend)
587
588 extern int
589 totpool(int connect, int update)
590
591 extern int
592 usepool(int connect, int update)
593 """
594
598
599 if __name__ == "__main__":
600 demo()
601