1 |
#-- |
2 |
|
3 |
# torqueAttMappers.py -- helper functions to map and/or convert names and values returned by torque. |
4 |
# Problem: some upstream tools like dynsched want LRMS-independent names for attribues. |
5 |
# also prefer 3601 seconds over 1:00:01 for a elapsed walltime. Mapper functions here |
6 |
# do the renaming and conversion. Also can filter attributes, for example most upstream |
7 |
# applications will not need to know what is in the very long STAGEOUT string. |
8 |
|
9 |
# $URL$ |
10 |
# $Id$ |
11 |
|
12 |
#-- |
13 |
|
14 |
# list of fields for which to convert times (H:M:S -> sec) |
15 |
tfl = ['resources_used.cput', 'Resource_List.cput', 'Resource_List.walltime', 'resources_used.walltime' ] |
16 |
|
17 |
def hms(instring): |
18 |
t = instring.split(':') |
19 |
secs = int(t[2]) + 60.0*(int(t[1]) + 60*int(t[0])) |
20 |
return secs |
21 |
|
22 |
# list of fields for which to convert memory |
23 |
mfl = ['Resource_List.pvmem', 'resources_used.mem', 'Resource_List.pmem', 'resources_used.vmem'] |
24 |
|
25 |
def memconvert(instr): |
26 |
if instr[-2:] == 'mb': |
27 |
return int(instr[:-2]) |
28 |
elif instr[-2:] == 'kb': |
29 |
return float(instr[:-2])/1024. |
30 |
else: |
31 |
return 'BADVAL' |
32 |
|
33 |
# list of fields for which to convert string timestamps -> unix timestamps (seconds since 1970) |
34 |
|
35 |
tfl2 = ['ctime', 'mtime', 'qtime', 'etime', 'start_time'] |
36 |
|
37 |
# attribute mapping dict to be used for the dynsched-pbs-plugin ... maps names to the ones |
38 |
# used by the dynamic scheduler. |
39 |
|
40 |
amap_dynsched = { |
41 |
'Resource_List.walltime' : 'maxwalltime', |
42 |
'resources_used.walltime' : 'walltime', |
43 |
'exec_host' : 'cpucount', |
44 |
'jobname' : 'name' |
45 |
} |
46 |
|
47 |
# attribute mapping dict to make some attribute names shorter |
48 |
|
49 |
amap_shortnames = { |
50 |
'Resource_List.pvmem' : 'req.pvmem', |
51 |
'resources_used.cput' : 'used.cpu', |
52 |
'Resource_List.nodes' : 'req.nodes', |
53 |
'Resource_List.cput' : 'req.cpu', |
54 |
'resources_used.mem' : 'used.mem', |
55 |
'Resource_List.pmem' : 'req.pmem', |
56 |
'resources_used.vmem' : 'used.vmem', |
57 |
'Resource_List.neednodes' : 'req.neednodes', |
58 |
'Resource_List.nodect' : 'req.nodect' |
59 |
} |
60 |
|
61 |
import time |
62 |
def tconv(instring): |
63 |
timetuple = time.strptime(instring,"%c") |
64 |
ts = time.mktime(timetuple) |
65 |
return ts |
66 |
|
67 |
def mapatts(indict): |
68 |
odict = dict() |
69 |
changekeys = amap.keys() |
70 |
for k in indict.keys(): |
71 |
if k in tfl: |
72 |
secs = hms(indict[k]) |
73 |
indict[k] = secs |
74 |
elif k in mfl: |
75 |
mem_num = memconvert(indict[k]) |
76 |
indict[k] = mem_num |
77 |
if k in changekeys: |
78 |
odict[amap[k]] = indict[k] |
79 |
else: |
80 |
odict[k] = indict[k] |
81 |
return odict |
82 |
|
83 |
def mapatts2(indict): |
84 |
odict = dict() |
85 |
changekeys = amap.keys() |
86 |
for k in indict.keys(): |
87 |
if k in tfl: |
88 |
secs = hms(indict[k]) |
89 |
indict[k] = secs |
90 |
elif k in mfl: |
91 |
mem_num = memconvert(indict[k]) |
92 |
indict[k] = mem_num |
93 |
elif k in tfl2: |
94 |
ts = tconv(indict[k]) |
95 |
indict[k] = ts |
96 |
if k in changekeys: |
97 |
odict[amap[k]] = indict[k] |
98 |
else: |
99 |
odict[k] = indict[k] |
100 |
return odict |
101 |
|