source: trunk/plugin/PBSQuery.py @ 94

Last change on this file since 94 was 94, checked in by bastiaans, 18 years ago

plugin/PBSQuery.py:

  • Added has_key function to _PBSObject
File size: 6.5 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 392 2005-03-02 16:47:25Z 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 pbs objects. All get..() functions returns an dictionary
13of openpbs/torque objects. There are four objects:
14 - server
15 - queue
16 - job
17 - node
18
19Each object can be handled as an dictionary and has several member
20functions.
21
22There are the following functions for PBSQuery:
23  job -
24        getjob(name, attributes=<default is all>)
25        getjobs(attributes=<default is all>)
26 
27  node -
28        getnode(name, attributes=<default is all>)
29        getnodes(attributes=<default is all>)
30
31  queue -
32        getqueue(name, attributes=<default is all>)
33        getqueues(attributes=<default is all>)
34
35  server -
36        get_serverinfo(attributes=<default is all>)
37
38Here is an example how to use the module:
39        from PBSQuery import PBSQuery
40        p = PBSQuery()
41        nodes = p.getnodes()
42        for name,node in nodes.items():
43            print name
44            if node.is_free():
45               print node
46
47"""
48import pbs
49
50
51class PBSQuery:
52    def __init__(self, server=None):
53        if not server:
54            self.server = pbs.pbs_default()
55        else:
56            self.server = server
57
58        self.con = pbs.pbs_connect(self.server)
59        self.attribs = 'NULL'
60
61    def __del__(self):
62        pbs.pbs_disconnect(self.con)
63        self.con = None
64        self.attribs = None
65
66    def _list_2_attrib(self, list):
67        """Convert an python list to an attrib list suitable for pbs"""
68        self.attribs = pbs.new_attrl( len(list) )
69        i = 0 
70        for attrib in list:
71            self.attribs[i].name = attrib
72            i = i + 1
73
74    def _list_2_dict(self, l, class_func):
75        """Convert an pbsstat function list to an class dictionary"""
76        self.d = dict()
77        for item in l:
78            new = class_func()
79            for a in item.attribs:
80                new.name = item.name
81                if a.resource:
82                   new.attribs[a.name + '.' + a.resource] = a.value
83                else:
84                   new.attribs[a.name] = a.value
85                self.d[item.name] = new
86        self._free(l)
87               
88    def _free(self, memory):
89        pbs.pbs_statfree(memory)
90
91    def _statserver(self, attrib_list=None):
92        """Get the server config from the pbs server"""
93        if attrib_list:
94           self._list_2_attrib(attrib_list)
95        else:
96           self.attribs = 'NULL'
97
98        serverinfo = pbs.pbs_statserver(self.con, self.attribs, 'NULL')
99        self.serverinfo = dict()
100        self._list_2_dict(serverinfo, server)
101
102    def get_serverinfo(self, attrib_list=None):
103        self._statserver(attrib_list)
104        return self.d
105
106    def _statqueue(self, queue_name='', attrib_list=None):
107        """Get the queue config from the pbs server"""
108        if attrib_list:
109           self._list_2_attrib(attrib_list)
110        else:
111           self.attribs = 'NULL'
112
113        queues = pbs.pbs_statque(self.con, queue_name, self.attribs, 'NULL')
114        self.queues = dict()
115        self._list_2_dict(queues, queue)
116
117    def getqueue(self, name, attrib_list=None):
118        self._statqueue(name, attrib_list)
119        return self.d
120       
121    def getqueues(self, attrib_list=None):
122        self._statqueue('', attrib_list)
123        return self.d
124
125    def _statnode(self, node_name='', attrib_list=None):
126        """Get the node config from the pbs server"""
127        if attrib_list:
128           self._list_2_attrib(attrib_list)
129        else:
130           self.attribs = 'NULL'
131
132        nodes = pbs.pbs_statnode(self.con, node_name, self.attribs, 'NULL')
133        self.nodes = dict()
134        self._list_2_dict(nodes, node)
135
136    def getnode(self, name, attrib_list=None):
137        self._statnode(name, attrib_list)
138        return self.d
139       
140    def getnodes(self, attrib_list=None):
141        self._statnode('', attrib_list)
142        return self.d
143
144    def _statjob(self, job_name='', attrib_list=None):
145        """Get the job config from the pbs server"""
146        if attrib_list:
147           self._list_2_attrib(attrib_list)
148        else:
149           self.attribs = 'NULL'
150           
151        jobs = pbs.pbs_statjob(self.con, job_name, self.attribs, 'NULL')
152        self.jobs = dict()
153        self._list_2_dict(jobs, job)
154
155    def getjob(self, name, attrib_list=None):
156        self._statjob(name, attrib_list)
157        return self.d
158       
159    def getjobs(self, attrib_list=None):
160        self._statjob('', attrib_list)
161        return self.d
162
163class _PBSobject:
164    TRUE  = 1
165    FALSE = 0
166
167    def __init__(self):
168        self.attribs = dict()
169        self.name = None
170
171    def __len__(self):
172        return(len(self.attribs.keys()))
173
174    def __str__(self):
175        data = self.name + '\n'
176        for name,value in self.attribs.items():
177                data = data + '\t%s = %s\n' %(name, value)
178        return(data)
179
180    __repr__ = __str__
181
182    def __getitem__(self,key):
183        if key == 'name':
184            return self.name
185       
186        return(self.attribs[key])
187
188    def has_key(self, key):
189        return self.attribs.has_key(key)
190
191    def get_value(self, key):
192        if self.attribs.has_key(key):
193           return self.attribs[key]
194        else:
195           return None
196
197    def keys(self):
198        return self.attribs.keys()
199
200    def values(self):
201        return self.attribs.values()
202
203    def items(self):
204        return self.attribs.items()
205   
206class job(_PBSobject):
207    """PBS job class"""
208
209    def is_running(self):
210        if self.get_value('job_state') == 'Q':
211           return self.FALSE
212        else:
213           return self.TRUE
214
215class node(_PBSobject):
216    """PBS node class"""
217
218    def is_free(self):
219        """Check if node is free"""
220        if self.get_value('state') == 'free':
221              return self.TRUE
222        else:
223              return self.FALSE
224
225    def has_job(self):
226        """Does the node run a job"""
227        if self.get_value('jobs'):
228              return self.TRUE
229        else:
230              return self.FALSE
231
232class queue(_PBSobject):
233    """PBS queue class"""
234
235    def is_enabled(self):
236        if self.get_value('enabled') == 'True':
237           return self.TRUE
238        else:
239           return self.FALSE
240
241    def is_execution(self):
242        if self.get_value('queue_type') == 'Execution':
243           return self.TRUE
244        else:
245           return self.FALSE
246
247
248class server(_PBSobject):
249    """PBS server class"""
250
251def main():
252    p = PBSQuery()
253
254    serverinfo = p.get_serverinfo()
255    for name, server in serverinfo.items():
256        print server
257        for key in server.keys():
258                print key, ' = ', server[key]
259
260    queues = p.getqueues()
261    for queue in queues.values():
262        if queue.is_execution():
263           print queue
264
265    jobs = p.getjobs()
266    for name,job in jobs.items():
267        if job.is_running():
268           print job
269
270    l = ['state']
271    nodes = p.getnodes(l)
272    for name,node in nodes.items():
273        if node.is_free(): 
274           print node
275
276if __name__ == "__main__":
277    main()
Note: See TracBrowser for help on using the repository browser.