source: trunk/src/PBSQuery.py @ 143

Last change on this file since 143 was 143, checked in by bas, 18 years ago

src/PBSQuery.py:

  • Added some functions get_version() for server, get_nodes for jobs
  • Property svn:keywords set to Id
File size: 7.0 KB
Line 
1#
2# Authors: Roy Dragseth (roy.dragseth@cc.uit.no)
3#          Bas van der Vlies (basv@sara.nl)
4#
5# SVN INFO:
6#       $Id: PBSQuery.py 143 2006-10-19 07:58:39Z bas $
7#
8"""
9Usage: from PBSQuery import PBSQuery
10
11This class gets the info from the pbs_server via the pbs.py module
12for the several batch objects. All get..() functions return an dictionary
13with id as key and batch object as value
14
15There are four batch objects:
16 - server
17 - queue
18 - job
19 - node
20
21Each object can be handled as an dictionary and has several member
22functions. The second parameter is an python list and can be used if you
23are only interested in certain resources, see example
24
25There are the following functions for PBSQuery:
26  job -
27        getjob(job_id, attributes=<default is all>)
28        getjobs(attributes=<default is all>)
29 
30  node -
31        getnode(node_id, attributes=<default is all>)
32        getnodes(attributes=<default is all>)
33
34  queue -
35        getqueue(queue_id, attributes=<default is all>)
36        getqueues(attributes=<default is all>)
37
38  server -
39        get_serverinfo(attributes=<default is all>)
40
41Here is an example how to use the module:
42        from PBSQuery import PBSQuery
43        p = PBSQuery()
44        nodes = p.getnodes()
45        for name,node in nodes.items():
46            print name
47            if node.is_free():
48               print node, node['state']
49
50        l = [ 'state', 'np' ]
51        nodes = p.getnodes(l)
52        for name,node in nodes.items():
53               print node, node['state']
54
55The parameter 'attributes' is an python list of resources that
56you are interested in, eg: only show state of nodes
57        l = list()
58        l.append('state')
59        nodes = p.getnodes(l)
60"""
61import pbs
62import UserDict
63import string
64import sys
65
66class PBSError(Exception):
67        def __init__(self, msg=''):
68                self.msg = msg
69                Exception.__init__(self, msg)
70               
71        def __repr__(self):
72                return self.msg
73
74        __str__ = __repr__
75
76
77class PBSQuery:
78        def __init__(self, server=None):
79                if not server:
80                        self.server = pbs.pbs_default()
81                else:
82                        self.server = server
83
84
85        def _connect(self):
86                """Connect to the PBS/Torque server"""
87                self.con = pbs.pbs_connect(self.server)
88                if self.con < 0:
89                        str = "Could not make an connection with %s\n" %(self.server)
90                        raise PBSError(str)
91
92        def _disconnect(self):
93                """Close the PBS/Torque connection"""
94                pbs.pbs_disconnect(self.con)
95                self.attribs = 'NULL'
96
97        def _list_2_attrib(self, list):
98                """Convert an python list to an attrib list suitable for pbs"""
99                self.attribs = pbs.new_attrl( len(list) )
100                i = 0 
101                for attrib in list:
102                        self.attribs[i].name = attrib
103                        i = i + 1
104
105        def _pbsstr_2_list(self, str, delimiter):
106                """Convert an string to an python list and use delimiter as spit char"""
107                l = sting.splitfields(str, delimiter)
108                if len(l) > 1:
109                        return l
110
111        def _list_2_dict(self, l, class_func):
112                """Convert an pbsstat function list to an class dictionary"""
113                self.d = {}
114                for item in l:
115                        new = class_func()
116                        self.d[item.name] = new
117                       
118                        for a in item.attribs:
119                                new.name = item.name
120                                if a.resource:
121                                        new[a.name + '.' + a.resource] = a.value
122                                else:
123                                        new[a.name] = a.value
124                self._free(l)
125               
126        def _free(self, memory):
127                pbs.pbs_statfree(memory)
128
129        def _statserver(self, attrib_list=None):
130                """Get the server config from the pbs server"""
131                if attrib_list:
132                        self._list_2_attrib(attrib_list)
133                else:
134                        self.attribs = 'NULL' 
135                       
136                self._connect()
137                serverinfo = pbs.pbs_statserver(self.con, self.attribs, 'NULL')
138                self._disconnect() 
139               
140                self.serverinfo = {}
141                self._list_2_dict(serverinfo, server)
142
143        def get_serverinfo(self, attrib_list=None):
144                self._statserver(attrib_list)
145                return self.d
146
147        def _statqueue(self, queue_name='', attrib_list=None):
148                """Get the queue config from the pbs server"""
149                if attrib_list:
150                        self._list_2_attrib(attrib_list)
151                else:
152                        self.attribs = 'NULL' 
153                       
154                self._connect()
155                queues = pbs.pbs_statque(self.con, queue_name, self.attribs, 'NULL')
156                self._disconnect() 
157               
158                self._list_2_dict(queues, queue)
159
160        def getqueue(self, name, attrib_list=None):
161                self._statqueue(name, attrib_list)
162                q_attrs = self.d['q_express']
163                return self.d
164       
165        def getqueues(self, attrib_list=None):
166                self._statqueue('', attrib_list)
167                return self.d
168
169        def _statnode(self, node_name='', attrib_list=None):
170                """Get the node config from the pbs server"""
171                if attrib_list:
172                        self._list_2_attrib(attrib_list)
173                else:
174                        self.attribs = 'NULL' 
175                       
176                self._connect()
177                nodes = pbs.pbs_statnode(self.con, node_name, self.attribs, 'NULL')
178                self._disconnect() 
179               
180                self.nodes = {}
181                self._list_2_dict(nodes, node)
182
183        def getnode(self, name, attrib_list=None):
184                self._statnode(name, attrib_list)
185                return self.d
186       
187        def getnodes(self, attrib_list=None):
188                self._statnode('', attrib_list)
189                return self.d
190
191        def _statjob(self, job_name='', attrib_list=None):
192                """Get the job config from the pbs server"""
193                if attrib_list:
194                        self._list_2_attrib(attrib_list)
195                else:
196                        self.attribs = 'NULL' 
197                       
198                self._connect()
199                jobs = pbs.pbs_statjob(self.con, job_name, self.attribs, 'NULL')
200                self._disconnect() 
201               
202                self.jobs = {}
203                self._list_2_dict(jobs, job)
204
205        def getjob(self, name, attrib_list=None):
206                self._statjob(name, attrib_list)
207                return self.d
208       
209        def getjobs(self, attrib_list=None):
210                self._statjob('', attrib_list)
211                return self.d
212
213class _PBSobject(UserDict.UserDict):
214        TRUE  = 1
215        FALSE = 0
216
217        def __init__(self):
218                UserDict.UserDict.__init__(self)
219                self.name = None
220
221        def get_value(self, key):
222                if self.has_key(key):
223                        return self[key]
224                else:
225                        return None
226
227class job(_PBSobject):
228        """PBS job class""" 
229        def is_running(self):
230                if self.get_value('job_state') == 'Q':
231                        return self.FALSE
232                else:
233                        return self.TRUE
234
235        def get_nodes(self):
236                nodes = self.get_value('exec_host')
237                if nodes:
238                        l = string.split(nodes,'+')
239                        return l
240                return list()
241
242
243class node(_PBSobject):
244        """PBS node class"""
245       
246        def is_free(self):
247                """Check if node is free"""
248                if self.get_value('state') == 'free':
249                        return self.TRUE
250                else: 
251                        return self.FALSE
252
253        def has_job(self):
254                """Does the node run a job"""
255                if self.get_value('jobs'):
256                        return self.TRUE
257                else:
258                        return self.FALSE
259
260class queue(_PBSobject):
261        """PBS queue class"""
262        def is_enabled(self):
263                if self.get_value('enabled') == 'True':
264                        return self.TRUE
265                else:
266                        return self.FALSE
267
268        def is_execution(self):
269                if self.get_value('queue_type') == 'Execution':
270                        return self.TRUE
271                else:
272                        return self.FALSE
273
274class server(_PBSobject):
275        """PBS server class"""
276
277        def get_version(self):
278                return self.get_value('pbs_version')
279
280def main():
281        p = PBSQuery() 
282        serverinfo = p.get_serverinfo()
283        for server in serverinfo.keys():
284                print server, ' version: ', serverinfo[server].get_version()
285        for resource in serverinfo[server].keys():
286                print '\t ', resource, ' = ', serverinfo[server][resource]
287
288        queues = p.getqueues()
289        for queue in queues.keys():
290                print queue
291                if queues[queue].is_execution():
292                        print '\t ', queues[queue]
293                if queues[queue].has_key('acl_groups'):
294                        print '\t acl_groups: yes'
295                else:
296                        print '\t acl_groups: no'
297
298        jobs = p.getjobs()
299        for name,job in jobs.items():
300                if job.is_running():
301                        print job
302
303        l = ['state']
304        nodes = p.getnodes(l)
305        for name,node in nodes.items():
306                if node.is_free(): 
307                        print node
308
309if __name__ == "__main__":
310        main()
Note: See TracBrowser for help on using the repository browser.