source: trunk/CHANGES @ 299

Last change on this file since 299 was 297, checked in by bas, 11 years ago

new version 4.3.6

  • Property svn:keywords set to Id
File size: 22.5 KB
Line 
1=========== 4.3.7
2 * pbs_jobmonitor/pbs_joblogin ported to torque 2.5 to fix jobarrays
3  Author: Willem Vermin (SURFsara)
4  Applied by: Bas van der Vlies
5 
6=========== 4.3.6
7 * Modified sara_nodes.py and new_rack_pbsmon.py so:
8   - We using argparse instead of OptionParser
9   - Changed the print statement to an print function which will work with Python 2.5+
10   - Removed module PBSAdvancedParser.py
11   Author: Dennis Stam
12
13=========== 4.3.5
14 * PBSQuery bugfix, parsing of node status line with multiple EVENT: settings
15   was wrong
16   Author: Bas van der Vlies
17
18 * Added an example how to make use of the EVENT status message:
19    - examples/pbs_script.sh
20   Author: Bas van der Vlies
21
22 * implemented __nonzero__ for PBS dictionary, closes #33, eg:
23    status = getjob(id)
24    if status:
25        do something
26    else:
27        no job
28  Author: Bas van der Vlies
29
30 * PBSQuery bugfix. getjob() can now handle short jobname, eg:
31    * p.getjob('6073545')
32
33   Author: Willem Vermin (SARA) & Bas van der Vlies
34
35 * added an example: pbs_jobmonitor shows the output of top
36   -u user on the node
37    - one cycle of top
38    - user: the user the job belongs to
39
40   renamed as pbs_joblogin logs in to the node as the user
41   who invokes this script (os.getenv('USER'))
42
43   Author: Willem Vermin (SARA)
44 
45=========== 4.3.3
46 * New generated files for pbs_wrap.c and pbs.py to support python 3.X versions
47   Reported by: Steve Traylen <steve dot traylen add cern dot ch>
48   Author: Bas van der Vlies
49
50 * Fixed AdvancedParser when using 01-12 range the zero was not appended.
51   Reported by: Ramon Bastiaans
52   Author: Dennis Stam
53
54 * examples/sara_nodes.py: Catch the PBSQuery error if we can not make a
55   connection with the batch server and exit the program.
56   Author: Bas van der Vlies
57
58 * Remove the debian dependency on AdvancedParser. We now have
59   our own PBSAdvanceParser so it does not conflict with other SARA
60   packages.
61   Reported by: Ramon Bastiaans (SARA)
62   Fixed by: Bas van der Vlies
63
64 * Make pbs_torque only dependend on libtorque instead of torque and adjusted
65   the maintainer of the package, closes #30
66   Reported by: Guillermo Marcus  <guillermo dot marcus add@gmail dot com>
67   Fixed by: Bas van der Vlies
68   
69=========== 4.3.0
70 * new_rack_pbsmon.py: For backward compatibility added -a/--all option.
71   Has the same functionality as -s/--summary
72   Author: Bas van der Vlies
73
74 * Added some license info to debian package and include GPL and LGPL 3.0
75   files.
76   Suggested by: W. Trevor King <wking at drexel dot edu>
77
78 * PBSQuery.py: Added support for new feature in node status field:
79    * message=EVENT:<key=value:>+
80    * message=ERROR <text>
81
82  Added the following syntax for node:
83        * node['error']
84    * node['event']
85
86  eg: node: n1
87    state = free
88    np = 8
89    properties = ib,switch1,highmem
90    ntype = cluster
91    jobs = 0/567403.sara.nl, 1/567403.sara.nl
92    status = ..,loadave=0.00,message=EVENT:sample.time=1288864220.003:cputotals.user=0:iconnect.pktout=0,netload=3487600394,state=free,...
93
94  example code:
95        p = PBSQuery()
96    node = p.getnode(n1)
97    print node.event['sample.time']
98    print node['event']['sample.time']
99
100   Requested by: Roy Dragseth <roy dot dragseth add uit dotno>
101   Author: Bas van der Vlies
102
103=========== 4.2.0
104 * Updated LICENSE file to LGPLV3. Thanks to Justin Bronder
105   (jsbronder add gentoo dot org) for the information and
106   explanation.
107
108 * examples/pbsmon.py. Patched so it also works for torque 2.5
109   Author: Stijn De Weirdt stijn dot deweirdt at ugent dot be
110   Applied by: Bas van der Vlies
111
112 * setup.py.in changed determine which torque version is installed
113   so we also support snapshots.
114   Author: Mark Roberts ( mark at gingergeeks dot co dot uk)
115   Applied by: Bas van der Vlies
116
117 * PBSQuery:
118   - get_nodes function for jobs now works for old and new datastructure and
119     gives correct results if unique=True
120     Reported by + idea for patch: Shunjie Lau (eijnuhs add gmail dot com)
121     Author: Bas van der Vlies
122
123 * Added AdvanceParser module. new_rack_pbsmon.py and sara_nodes.py make use of
124   this module
125   Author: Dennis Stam (Dennis dot Stam at sara dot nl)
126
127 * examples/new_rack_pbsmon.py:
128     - Better specification for node expression
129     - added a new option -l/--list to list the state of a nodes and which job
130       is running on it, eg:
131             new_rack_pbsmon.py - l gb-r[1-3]n[3-6] gb-r4[n1-20]
132
133   Authors: Dennis Stam & Bas van der Vlies
134   Applied by: Bas van der Vlies
135
136 * examples/sara_nodes.py:
137   An utility to set/clear notes for multiple nodes, see ..
138   Author: Dennis Stam (Dennis dot Stam at sara dot nl)
139
140 * setup.py.in:
141   Added support for runtime-libraries when torque is installed in a non-default
142   location, closes #22
143   Author: Mattias (slabanja at chalmers dot se)
144   Applied by: Bas van der Vlies
145
146 * Changed build system for debian
147   Authors: Dennis Stam & Bas van der Vlies
148
149=========== 4.1.2
150 * examples/new_rack_pbsmon.py now uses the new PBSQuery data
151   structure.
152   Author: Bas van der Vlies
153
154 * PBSQuery:
155     - fixed and error in get_jobs function for nodes. Did not
156       support new data structure and uniq did not work.
157       Authors: Shunjie Lau <eijnuhs at gmail dot com> and Bas van der Vlies
158
159=========== 4.1.0
160 * Delete function pbs.version() replaced by
161    * pbs.version
162        This is a string variable
163    * pbs.version_info
164        Is a tuple variable. So we can use it in scripts
165
166   This analogue with sys module, closes #20
167
168   Requested by: Dennis Stam ( Dennis dot Stam add sara dot nl )
169   Author: Bas van der Vlies
170
171 * More robust make/configure/setup.py
172   Reported by:
173        - Saidi, Yacine <saidi add linmpi dot mpg dot de>
174        - Shunjie Lau <eijnuhs add gmail dot com>
175   Author: Bas van der Vlies
176
177
178 * Only use the pbs_wrap.c and pbs.py 2.4 version for torque version 2.4.7 and higher.
179   Reported by: Saidi, Yacine <saidi add linmpi dot mpg dot de>
180   Author: Bas van der Vlies
181   
182=========== 4.0.2
183  * Quick fix so we do not get any undefined symbols. Forgot to
184    add the torque library when we compile the package.
185    Reported by: Shunjie Lau ( eijnuhs add gmail dot com)
186    Author: Bas van der Vlies
187
188=========== 4.0.1
189  * Fixed a bug in setting the right library path  for compiling.
190    Reported by: Chad Vizino ( vizino add psc dot edu )
191    Author: Bas van der Vlies
192   
193=========== 4.0.0
194  * pbs.py added some new functions for 2.4 version:
195    - pbs_fbserver(void);
196    - pbs_get_server_list(void);
197    - pbs_sigjobasync(int connect, char *job_id, char *signal, char *extend);
198    - pbs_alterjob_async(int connect, char *job_id, struct attrl *ATTRL, char *extend);
199    - pbs_checkpointjob(int connect, char *job_id, char *extend);
200    - log_ext(int,char *,char *,int);
201    - log_init(char *, char *);
202    - log_remove_old(char *,unsigned long);
203
204    Note: version 2.1.X is still supported
205
206  * autotools environment
207    - Added support for finding pbs-config (borrowed for mpiexec source)
208    - Detecting which version of torque is installed
209    - only support installations that have pbs-config installed.
210    - Removed old code for installations that do not a have pbs-config
211      installed.
212
213  * PBSQuery.py
214    - There was a bug in the new data interface (Resource_List for jobs)
215      Reported & Patch by: Mark Roberts ( mark at gingergeeks dot co dot uk)
216      Applied by with some minor changes: Bas van der Vlies
217
218    - The new data structure is the default. You can switch back to the old
219      one with:
220            p = PBSQuery()
221            p.old_data_structure()
222
223      Author: Bas van der Vlies
224
225   * examples/ha_server.py
226     An example how to use the High Availabilty torque functions
227     Author: Bas van der Vlies & Mark Roberts ( mark at gingergeeks dot co dot uk )
228
229=========== 3.6.0
230  * pbs, new generated pbs_wrap.c, pbs.py fixes a bug in pbs_runjob()
231    Reported by: Dennis Stam
232    Fixed by: Bas van der Vlies
233
234=========== 3.5.0
235  * PBSQuery
236        The class functions of node, job and queue support old and new data
237        structure.
238
239        Changed the behaviour of the new data stucture, We can use it as
240        dictionary and as class attribute, this is equivalent, eg:
241          - print node['np'] and print node.np
242
243        for a node we parse the 'status' line and split on '=' char, You now can
244        use these statements, eg
245          - print node.status.arch     (node['status'].arch or node['status']['arch'])
246          - print node.status.nsession
247
248        for a job we parse the 'Variable_List' line and split on '=' char, You now can
249        use the statements, eg:
250          - print job.Variable_List.PBS_O_WORKDIR
251          - print job.Variable_List.PBS_O_HOME
252
253        For more info see examples/new_interface.py
254
255    Author: Bas van der Vlies
256
257 * new_rack_pbsmon.py
258        Rewrite to new data structure and automatically determine how many nodes
259        and racks cluster has and skip printing of empty racks (default), use -w/--wide
260        for old behaviour.
261
262   Author: Bas van der Vlies
263
264
265=========== 3.2.0
266        - PBSQuery:
267          New data structure. In the old structure it is a dictionary
268          with a value and the value is a string. This is changed
269          that dictionary values are now of type list or dictionary depends
270          on the value of the keyword, eg for a node:
271            - np = 2:
272              * node['np'] = [ '2' ] 
273
274            - properties = cores2, mem4gb, parallel
275              * node['properties'] = [ 'cores2', 'mem4gb', 'parallel' ]
276
277            - status = arch=x86_64,sessions=22599,,size=70627864kb, ...
278              * node['status']['arch'] = [ 'x86_64' ]
279              * node['status']['sessions'] = [ '222599' ]
280              * ...
281
282         The data structure is activated by the function:
283          * new_data_structure()
284
285        In a future release it will be come the default.
286        example:
287                p = PBSQuery()
288                p.new_data_structure()
289
290                nodes = p.getnodes()
291                print nodes.np, nodes['np']
292
293        Author: Bas van der Vlies
294
295        - PBSQuery
296          For old and new data structure we now can use another syntax:
297           * node['np'] and node.np are equivalent
298
299          This new syntax works for all keywords.
300
301        Author: Bas van der Vlies
302
303        - Added iter object for job, node, queue and server objects, eg:
304          node = p.getnode('gb-r1n1')
305          print node.name
306          for attrib in node:
307                print '%\t%s = %s' %(attrib, node[attrib])
308        Author: Bas van der Vlies
309
310        - fixed an error in getnode, getqueue and getjob, return empty
311          dictionary if not found
312        Author: Bas van der Vlies
313       
314        - New build system for rpm packages, make -f Makefile.rpm
315          Author: Michel Jouvin <jouvin add lal dot in2p3 dot fr>
316
317        Applied: Bas van der Vlies
318
319=========== 3.0.1
320        - PBSQuery
321                * Removed a testing code line
322                Reported By: sam @ vpac dot org
323                Fixed by: Bas van der Vlies
324
325=========== 3.0.0
326        - PBSQuery
327                * Cleaned up some old lines of code which didn't do anything.
328                * Changed the returnvalue of getqueue, getnode and getjob. Now
329                  they return an instance of the object, instead of a dict.
330                  This is API change so we bumped the version to 3.0.0
331                * Now the getnode-function accepts the short name as well as
332                  the long name as an argument.
333
334                Author: Sil Westerveld <Sil.Westerveld@sara.nl>
335
336        - pbs.py, _pbs.so, PBSQuery.py
337                * Fixed a memory leak when used in daemon mode
338                Author: Bas van der Vlies <basv@sara.nl>
339
340=========== 2.9.8
341        - pbs_python.spec file patch added libdir and python defines so it
342          will build for RHEL5.1/CentOS 5.1
343          by        : Michael Sternberg <sternberg add anl dot gov>
344          applied by: Bas van der Vlies
345
346        - Updated the header files for pbs_python. So it can use some new
347          defines variables/defines, eg:
348                * ATTR_NODE_status
349                * ATTR_NODE_note
350                * ...
351          Added by: Dennis Stam <dennis.stam@sara.nl>, Bas van der Vlies
352
353        - Two new functions to log.h:
354                log_roll(int size);
355                log_size(void);
356          Added by: Bas van der Vlies
357
358        - We now have proper destructors (free memory) in SWIG for attrl and
359          attropl attributes.
360          Added by: Bas van der Vlies
361
362        - PBSQuery
363                * Added getnodes_with_property() function. This will get all nodes with
364                  a certain property, eg:
365                   - get all nodes with property 'cores8' and return all attributes:
366                      getnodes_with_property('cores8')
367               
368                   - get all nodes with property 'cores2' and only return the
369                     attributes 'state' and 'properties':
370                      attrl = [ 'state', 'properties' ]
371                      getnodes_with_property('cores2', attrl)
372               
373                     Only for torque version > 2.1.0
374             
375                Added by: Bas van der Vlies
376
377                * Added to class node the function
378                 - get_jobs(self, unique=None)
379                   Returns a list of the currently running job-id('s) on the node.
380                Added by: Sil Westerveld <Sil.Westerveld@sara.nl>
381
382                * Added get_server_name() function.
383                  This will return the PBS-server's name.
384                Added by: Sil Westerveld <Sil.Westerveld@sara.nl>
385
386                * Added to class _PBSobject the function
387                  - uniq(self, list)
388                    Filters out unique items of a list.
389                Added by: Sil Westerveld <Sil.Westerveld@sara.nl>
390
391                * Added to class job the function
392                  - get_nodes(self, unique=None)
393                    Returns a list of the nodes which run the job.
394                Added by: Sil Westerveld <Sil.Westerveld@sara.nl>
395
396=========== Version 2.9.4
397        -  Function pbs.pbs_geterrmsg does not exits any more is
398           replaced by pbs.error():
399                errno, text = pbs.error()
400                print errno, text
401           Reported by: pk at q-leap dot com
402           Fixed by   : Bas van der Vlies
403
404        - PBSQuery.py
405           * Added get_version() for server class, returns the version of
406             the batch server
407             Added by    : Bas van der Vlies
408
409           * Added get_nodes() for job class, returns a list of nodes on
410             which the job is run
411             Added by    : Bas van der Vlies
412
413           * PBSQuery.py rewrite make use of UserDict module.
414             Suggested by: Ramon Bastiaans
415             Fixed by    : Bas van der Vlies
416
417=========== Version 2.9.2
418        - The function pbs_rescquery() did not work. Fixed it
419        - The function avail(), did not work fixed it
420        - The functions pbs_rescreserve and pbs_rescrelease did not work
421          fixed it
422
423        - Fixed a bug in new_rack_pbsmon.py. Counting of serial
424          nodes was wrong and state down has topmost priority
425
426=========== Version 2.9.0
427        - Added support for new torque build system 2.1.0
428        - Added new_rack_pbsmon.py
429          Authors: Walter de Jong & Bas van der Vlies
430
431=========== Version 2.8.2
432
433Configure has a new option:
434        --with-pbsdir=PATH
435
436If set it will use PATH specified as argument to
437find the pbs/torque libraries. If unset it will use
438some useful defaults to find the libaries.
439Suggested by: Troy Baer
440
441PBSQuery.py:
442        - If we can not make a connection with the server
443          then raise an exception and let the programmer
444          decides what to do.
445
446pbs_python.spec:
447        - It can now handle mode bits
448          Author: Martin Pels from SARA
449       
450=========== Version 2.8.0
451
452setup.py:
453        - Added /usr/lib to PBS_LIB_DIR
454
455pbs.py:
456        - Added new function "pbs.error()". This function checks if
457          an error has occured with a pbs function, eg:
458            task_id = pbs.pbs_submit(c, attrl, "A.tsk", 'NULL', 'NULL')
459            error_number, err_txt = pbs.error()
460            if error_number:
461                print error_number, err_txt
462
463          prints the following message if script A.tsk does not exists:
464            15042 (qsub) cannot access script file
465
466pbs_python.spec:
467        - to make rpm packages from the source package, initial version
468        Author: Martin Pels from SARA
469
470README:
471        - Now requires python 2.1 and higher
472        - Explain how to build DEBIAN package
473
474=========== Version 2.7.10
475
476PBSQuery.py:
477        Fixed an error. You always got all resources from eg nodes
478        even when you supplied an attribute list where you only
479        requested the 'state' of the node.
480
481        Updated the inline python documentation
482
483=========== Version 2.7.9
484
485Fixed an error the previous version was in DEBUG mode. So
486you get an lot undesired output on the screen.
487
488debian package now also generated a package with the write
489version info.
490
491=========== Version 2.7.8
492
493Setup.py:
494        Can also handle ROCKS installations + the version
495        info is now the same as pbs.py
496        Thanks to: Roy Dragseth
497
498=========== Version 2.7.7
499
500PBSQuery module:
501  It can now be used in daemon programs. The pbs_server closes
502  the connection after an certain amount of time. This is fixed,
503  before every query there is an new connection and if the query
504  is finished the connection is closed.
505 
506=========== Version 2.7.6
507
508Now setup.py can also handle old Oscar Installations.
509Thanks To: Robin Humble
510
511Fixed an print statement fix in new_interface.py:
512Thanks To: Robin Humble
513
514Made some improvements for PBSQuery module:
515        - Updated the documentation
516        - Added the has_key() function to all
517          PBSObjects. So that the behaviour is similar to
518          an dictionary
519          Suggested By: Ramon Bastiaans
520       
521=========== Version 2.7.5
522 Added PBSQuery module.  This module requires pbs.py and it a simple module
523 for querying the pbs server. The documentation is in the module. Use for
524 example ipython to read it.
525
526 Written By: Roy Dragseth
527             Bas van der Vlies
528
529 eg: ( see also examples/new_interface.py)
530
531 from PBSQuery import PBSQuery
532 p = PBSQuery()
533
534 jobs = p.getjobs()
535 for name, job in jobs.items()
536        print job
537
538=========== Version 2.7.4
539 New versions fixes an bug in function pbs.pbs_statnode().
540 Reported by: Keith Poirier
541
542 Configure support:
543 Contributed By: Yaroslav Halchenko
544
545 Debian package support:
546 Contributed By: Yaroslav Halchenko
547
548 Added Support for Debuging the interface, You must edit pbs_wrap.c
549 and search for SARA_DEBUG:
550        #define SARA_DEBUG 1
551 Implemented by: Ramon Bastiaans
552
553 examples/pbsmon.py:
554        - Fixed an error when regex fails to determine node number,
555          no status was displayed
556        - It will now display and 'j' if the node is free for the batch
557          system and a job runs on the node (SMP-systems).
558 Changed by: Bas van der Vlies
559
560 examples/rack_pbsmon.py:
561        - An pbsmon that display node info per rack
562        - Edit the rack_pbsmon.py to adjust the values. It requires
563          that hostname contains rack and node id's,
564          eg: gb-r<number>n<number>
565 Contributed by: Walter de Jong
566
567=========== Version 2.7.3
568 The name SPBS is changed to the new name TORQUE (Tera-scale Open-source
569 Resource and QUEing manager).
570
571 The interface support OPENPBS and TORQUE.
572
573=========== Version 2.7.2
574 Some minor changes to include files. Now the Scalable PBS keywords
575 are also supported ( server attribute names: node_ping_rate and
576 node_check_rate). This does not interfere with the openpbs software.
577
578 pbsmon.py could not handle an one node cluster. Fixed it.
579
580=========== Version 2.7
581 Forgot to wrap the pbs_statfree() function. So we could not free
582 allocated memory from functions that return 'struct batch_status *'
583 like pbs_statjob().
584
585 pbsmon.py can now handle 2 and 3 digit hostnames. Patch supplied by
586 Daniel Olson
587
588=========== Version 2.6.1
589 Setup.py now checks if all openpbs libraries are installed to compile the
590 package.
591
592=========== Version 2.6
593
594 Fixed a bug in the pbs python module. Forgot to map the pbs_statjob()
595 function. This bug prevented to pass 'struct attrl' variables to this
596 function. Thanks to Evelyn Shiu for reporting this bug.
597
598
599=========== Version 2.5
600 Added the OpenPbs logging functions (log.h and liblog.a). There
601 is an example in the examples directory: logpbs.py
602
603 Fixed a bug in examples/resmom_info.py used the default port for
604 pbs_resmon if getservbyname fails.
605
606 Fixed a bug in resmom code. If the user has no permissions to query
607 the pbs_mom daemon a empty string is returned. Now we check for
608 the empty string. So we do not get a python exception.
609
610 Fixed a bug in setup.py forgot the exit statement when we did not
611 find the pbs libraries.
612
613=========== Version 2.3
614 Bugfix in the pbsnodes-a.py. Forgot to import the sys module.
615
616 Removed some obsolete code.
617
618 As for now we make use of the distutils module. So the package
619 is automatically compiled and installed in proper directories, usage:
620    python setup.py install
621 This requires that the package 'distutils' must be installed. As for
622 version 1.6 and higher it is in the distribution.
623
624 Added a function that prints the pbs python interface version. So we
625 can check if we have the right interface version:
626 import pbs
627 print pbs.version()
628 
629
630=========== Version 2.2
631
632In this release we can query the pbs_mom daemon with the aid of
633resource management functions:
634   pbs.openrm()
635   pbs.closerm()
636   pbs.downrm()
637   pbs.configrm()
638   pbs.addreq()
639   pbs.allreq()
640   pbs.flushreq()
641   pbs.activereq()
642   pbs.fullresp()
643   pbs.getreq()
644
645There is also a python function:
646   pbs.get_mom_values(id, [list]):
647     id   - connection id of pbs.openrm(node-name, port-number)
648     list - Is a optional paramter. A list of resource keywords
649
650   If 'list' is not supplied then this function will get the values
651   for the standard resource keywords, eg uname, loadave, .. + 'arch'
652   depended keywords. The arch feature is only implemented for linux,
653   but it can easily be ported to other oses.
654
655   if 'list' is supplied then we only fetch values for the keywords
656   that are in the list.
657
658   The function returns a dictonary. The keys are the resource keywords.
659
660   See 'resmom_info.py' for a example of this new feature.
661
662=========== Version 2.0
663
664The previous version was a simple interface above the PBS C API LIB.  This
665interface has gone a major changes. The most noticeable change is  that
666the functions accept/return Python lists instead of C-lists.  So you can now
667use standard Python syntax for manipulating Python lists. If you are familar
668with the Python syntax then you will appreciate this new interface.
669
670NOTE:
671  This interface is NOT compatible with the old one
672
673Here are some guidelines to convert your code to the new one:
674
675The constructors for the struct has gone a major change:
676  old code:
677    temp = pbs.new_attrl();
678    attrl_p = pbs.attrlPtr(temp)
679    attrl_p.name = 'state'
680
681  new_code:
682     attr_l = pbs.new_attrl(1)   // Creates a list of attrl structs length 1
683     attr_l[0].name = 'state'
684
685
686The pbs_stat functions returns Python lists instead of C-lists. There is
687NO next field anymore:
688  old_code:
689    temp = pbs.new_attrl();
690    attrl_p = pbs.attrlPtr(temp)
691    attrl_p.this = 'NULL'
692
693    nodes = pbs.pbs_statnode(con, "", attrl_p, "NULL")
694
695    while nodes.this != 'NULL':
696      print nodes.name
697
698      node_attrl = nodes.attribs
699      while node_attrl.this != 'NULL':
700        print '\t', node_attrl.name, '=', node_attrl.value
701        node_attrl = node_attrl.next
702
703    nodes = nodes.next
704
705
706  new_code:
707    nodes = pbs.pbs_statnode(con, "", "NULL", "NULL")
708    for node in nodes:
709      print node.name
710      for attrib in node.attribs:
711        print '\t', attrib.name, '=', attrib.value
712
713Another advantage is you can use the print statement to show the
714connect of attrl and attropl classes:
715   attr_l = pbs.new_attrl(2)
716   attr_l[0].name = 'bas'
717   attr_l[0].value = 'van der Vlies'
718
719   print  attr_l[0]
720   >> (bas,,van der Vlies)
721   
722I hope these examples illustrate the changes. If you specify a wrong type
723for a function then function wil raise a Python exception.
Note: See TracBrowser for help on using the repository browser.