| #!/usr/bin/env python | 
 | # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 | # -*- coding: utf-8 -*- | 
 | # ---------------------------------- | 
 | # qsubOptions Class | 
 | # ---------------------------------- | 
 | """A helper class designed to handle the managment of options and | 
 | positional arguments to qsub and related Grid Engine executables. | 
 |  | 
 | Contains functions to write the requested execution string either | 
 | to the command line or to a script file. | 
 | """ | 
 |  | 
 | import argparse | 
 |  | 
 |  | 
 | class qsubOptions(): | 
 |     "A data type meant to collect qsub options. See man qsub for information" | 
 |  | 
 |     def __init__(self, optstring='', prog='qsub'): | 
 |         # Which SGE command are we going to work with? | 
 |         self.prog = prog | 
 |         sge_program_names = [ | 
 |             'qsub', 'qrsh', 'qsh', 'qlogin', 'qalter', 'qresub', 'qmake' | 
 |         ] | 
 |         assert self.prog in sge_program_names, 'Unsupported SGE command: ' + prog + \ | 
 |             'not one of ' + ', '.join(sge_program_names) | 
 |  | 
 |         if prog == 'qmake' and '-pe' in optstring: | 
 |             prog = 'qsub' | 
 |         else: | 
 |             prog = 'qrsh' | 
 |  | 
 |         # SUPPRESS = If not specified, do not generate variable in namespace | 
 |         self.parser = argparse.ArgumentParser( | 
 |             description='Options to pass to qsub', | 
 |             formatter_class=argparse.RawTextHelpFormatter, | 
 |             argument_default=argparse.SUPPRESS, | 
 |             epilog="""The following is scraped from the qsub manpage for GE \ | 
 |             6.2u5 dated 2009/12/01 12:24:06""") | 
 |  | 
 |         # BEGIN SGE OPTION PARSER | 
 |         # BUG if help still begins with a line with -option, have cosmetic bug where | 
 |         # metavar cannot be specified correctly | 
 |  | 
 |         yesno = ['y', 'yes', 'n', 'no'] | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin']: | 
 |             self.parser.add_argument('-@', | 
 |                                      metavar='optionfile', | 
 |                                      help="""\ | 
 |               Forces qsub, qrsh, qsh, or qlogin to use the options contained | 
 |               in optionfile. The indicated file may contain all | 
 |               valid options. Comment lines must start with a "#" sign.""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-a', | 
 |                                      metavar='date_time', | 
 |                                      help="""\ | 
 |               Available for qsub and qalter only. | 
 |  | 
 |               Defines or redefines the time and date at  which  a  job  is  eligible | 
 |               for  execution.  Date_time  conforms  to [[CC]]YY]MMDDhhmm[.SS], | 
 |               for the details, please see Date_time in: sge_types(1). | 
 |  | 
 |               If  this  option is used with qsub or if a corresponding value is specified | 
 |               in qmon then a parameter named a and the value in the format CCYYMMDDhhmm.SS | 
 |               will be passed to the defined JSV instances (see -jsv  option  below  or | 
 |               find more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-ac', | 
 |                                      metavar='variable[=value]', | 
 |                                      action='append', | 
 |                                      help=""" -ac variable[=value],... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Adds  the  given  name/value  pair(s)  to the job's context. Value may be omitted. | 
 |               Grid Engine appends the given argument to the list of context variables for the job. | 
 |               Multiple -ac, -dc, and -sc options may  be  given.   The order is important here. | 
 |  | 
 |               The  outcome  of  the  evaluation  of all -ac, -dc, and -sc options or | 
 |               corresponding values in qmon is passed to defined JSV instances as parameter | 
 |               with the name ac.  (see -jsv option below or find more information concerning | 
 |               JSV in jsv(1)) QALTER allows changing this option even while the job executes.""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qsub', 'qalter', 'qrsh', 'qsh', 'qlogin']: | 
 |             self.parser.add_argument('-ar', | 
 |                                      metavar='ar_id', | 
 |                                      help="""\ | 
 |               Available for qsub, qalter, qrsh, qsh, or qlogin only. | 
 |  | 
 |               Assigns  the  submitted  job  to  be  a  part of an existing Advance Reservation. | 
 |               The complete list of existing | 
 |               Advance Reservations can be obtained using the qrstat(1) command. | 
 |  | 
 |               Note that the -ar option adds implicitly the -w e option if not otherwise requested. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job however. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified | 
 |               then this value will be passed to defined JSV instances as parameter | 
 |               with the name ar.  (see -jsv option below or find  more  information | 
 |               concerning  JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-A', | 
 |                                      metavar='account_string', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Identifies the account to which the resource consumption of the | 
 |               job should be charged. The account_string should | 
 |               conform to the name definition in M sge_types 1 . | 
 |               In the absence of this parameter Grid Engine will  place  the | 
 |               default account string "ge" in the accounting record of the job. | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified | 
 |               then this value will be passed to defined JSV instances as parameter with the name A. | 
 |               (see -jsv option below or  find  more  information  concerning  JSV  in jsv(1))""" | 
 |                                      ) | 
 |  | 
 |         self.parser.add_argument('-binding', | 
 |                                  nargs='+', | 
 |                                  metavar=('binding_instance', | 
 |                                           'binding_strategy'), | 
 |                                  help="""\ | 
 |        -binding [ binding_instance ] binding_strategy | 
 |  | 
 |               A  job  can  request a specific processor core binding (processor affinity) | 
 |               with this parameter. This request is neither a hard nor a soft request, | 
 |               it is a hint for the execution host to do this if possible.  Please note that | 
 |               the  requested binding strategy is not used for resource  selection  within | 
 |               Grid Engine.  As a result an execution host might be selected where Grid Engine | 
 |               does not even know the hardware topology and therefore is not able | 
 |               to apply the requested binding. | 
 |  | 
 |               To enforce Grid Engine to select hardware on which the binding can be applied | 
 |               please use the -l switch in combination with the complex attribute m_topology. | 
 |  | 
 |               binding_instance is an optional parameter. | 
 |               It might either be env, pe or set depending on which instance  should | 
 |               accomplish the job to core binding. If the value for binding_instance | 
 |               is not specified then set will be used. | 
 |  | 
 |               env  means  that  the  environment variable SGE_BINDING will be exported | 
 |               to the job environment of the job. This variable contains the selected | 
 |               operating system internal processor numbers.  They might be  more  than  selected | 
 |               cores  in  presence of SMT or CMT because each core could be represented | 
 |               by multiple processor identifiers.  The processor numbers are space separated. | 
 |  | 
 |               pe means that the information about the selected cores appears in | 
 |               the fourth column of the pe_hostfile. Here the logical  core  and | 
 |               socket numbers are printed (they start at 0 and have no holes) | 
 |               in colon separated pairs (i.e. 0,0:1,0 which means core 0 on socket 0 and | 
 |               core 0 on socket 1).  For more  information  about  the  $pe_hostfile | 
 |               check ge_pe(5) | 
 |  | 
 |               set (default if nothing else is specified). The binding strategy is applied | 
 |               by Grid Engine. How this is achieved depends on the underlying hardware | 
 |               architecture of the execution host where the submitted job will be started. | 
 |  | 
 |               On Solaris 10 hosts a processor set will be created where the job can | 
 |               exclusively run in.  Because of  operating system limitations at least | 
 |               one core must remain unbound. This resource could of course used by an unbound job. | 
 |  | 
 |               On  Linux  hosts  a  processor affinity mask will be set to restrict  the job | 
 |               to run exclusively on the selected cores. | 
 |               The operating system allows other unbound processes to use these cores. | 
 |               Please note that on  Linux  the binding  requires  a  Linux  kernel | 
 |               version of 2.6.16 or greater. It might be even possible to use a kernel with | 
 |               lower version number but in that case additional kernel patches have to be | 
 |               applied. The loadcheck  tool  in  the utilbin directory can be used to check | 
 |               if the hosts capabilities.  You can also use the -sep in combination with | 
 |               -cb of qconf(5) command to identify if Grid Engine is able to recognize the | 
 |               hardware topology. | 
 |  | 
 |               Possible values for binding_strategy are as follows: | 
 |  | 
 |                   linear:<amount>[:<socket>,<core>] | 
 |                   striding:<amount>:<n>[:<socket>,<core>] | 
 |                   explicit:[<socket>,<core>;...]<socket>,<core> | 
 |  | 
 |               For the binding strategy linear and striding there is an optional | 
 |               socket and core pair attached. | 
 |               These  denotes the mandatory starting point for the first core to bind on. | 
 |  | 
 |               linear  means  that  Grid Engine tries to bind the job on amount successive cores. | 
 |               If socket and core is omitted then Grid Engine first allocates successive cores | 
 |               on the first empty socket found.  Empty means that  there  are | 
 |               no  jobs bound to the socket by Grid Engine.  If this is not  possible or is | 
 |               not sufficient Grid Engine tries to | 
 |               find (further) cores on the socket with the most unbound cores and so on. | 
 |               If the amount of allocated  cores  is | 
 |               lower  than  requested  cores,  no binding is done for the job. | 
 |               If socket and core is specified then Grid Engine | 
 |               tries to find amount of empty cores beginning with this starting point. | 
 |               If this is not possible then binding  is not done. | 
 |  | 
 |               striding means that Grid Engine tries to find cores with a certain offset. | 
 |               It will select amount of empty cores with a offset of n -1 cores in between. | 
 |               Start point for the search algorithm is socket 0  core  0.  As  soon  as | 
 |               amount  cores are found they will be used to do the job binding. | 
 |               If there are not enough empty cores or if correct offset cannot be | 
 |               achieved then there will be no binding done. | 
 |  | 
 |               explicit binds the specified sockets and cores that  are  mentioned | 
 |               in  the  provided  socket/core  list.  Each socket/core  pair  has to | 
 |               be specified only once.If a socket/core pair is already in use by a different job the | 
 |               whole binding request will be ignored. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If  this  option  or  a corresponding value in qmon is specified then these values | 
 |               will be passe to defined JSV instances as parameters with the names binding_strategy, | 
 |               binding_type, binding_amount,  binding_step,  binding_socket, | 
 |               binding_core, binding_exp_n, binding_exp_socket<id>, binding_exp_core<id>. | 
 |  | 
 |               Please  note that the length of the socket/core value list of the explicit binding is | 
 |               reported as binding_exp_n. | 
 |               <id> will be replaced by the position of the socket/core pair  within  the  explicit | 
 |               list  (0  <=  id  <  binding_exp_n).   The first socket/core pair of the explicit | 
 |               binding will be reported with the parameter names bind- | 
 |               ing_exp_socket0 and binding_exp_core0. | 
 |  | 
 |               Values that do not apply for the specified binding will not be reported to JSV. | 
 |               E.g. binding_step will only  be | 
 |               reported for the striding binding and all binding_exp_* values will passed to | 
 |               JSV if explicit binding was speci‐ | 
 |               fied.  (see -jsv  option  below or find more information concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh']: | 
 |             self.parser.add_argument('-b', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh only. Qalter does not allow changing this option. | 
 |               This option cannot be embedded in the script file itself. | 
 |  | 
 |               Gives  the user the possibility to indicate explicitly whether command should be | 
 |               treated as binary or script. If the value of -b is 'y', then command  may be a | 
 |               binary or script.  The command might not be accessible  from  the | 
 |               submission  host.   Nothing  except  the path of the command will be | 
 |               transferred from the submission host to the | 
 |               execution host. Path aliasing will be applied to the path of command | 
 |               before command will be executed. | 
 |  | 
 |               If the value of -b is 'n' then command needs to be a script and it will | 
 |               be handled as script.  The  script  file | 
 |               has to be accessible by the submission host. | 
 |               It will be transferred to the execution host. qsub/qrsh will search | 
 |               directive prefixes within script. | 
 |  | 
 |               qsub will implicitly use -b n whereas qrsh will apply the -b y option | 
 |               if nothing else is specified. | 
 |  | 
 |               The value specified with this option or the corresponding value | 
 |               specified in qmon will only be passed to defined | 
 |               JSV instances if the value is yes.  The name of the parameter will be b. | 
 |               The value will be y also when then long | 
 |               form yes was specified during submission. | 
 |               (see -jsv option below or find more  information  concerning  JSV  in | 
 |               jsv(1)) | 
 |  | 
 |               Please  note  that  submission of command as script (-b n) can have a | 
 |               significant performance impact,especially for short running jobs and big job scripts. | 
 |               Script submission adds a number of  operations  to  the  submission | 
 |               process: The job script needs to be | 
 |               - parsed at client side (for special comments) | 
 |               - transferred from submit client to qmaster | 
 |               - spooled in qmaster | 
 |               - transferred to execd at job execution | 
 |               - spooled in execd | 
 |               - removed from spooling both in execd and qmaster once the job is done | 
 |               If job scripts are available on the execution nodes, e.g. via NFS, binary | 
 |               submission can be the better choice.""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-c', | 
 |                                      metavar='occasion_specifier', | 
 |                                      help="""\ | 
 |               Available for qsub and qalter only. | 
 |  | 
 |               Defines or redefines whether the job should be checkpointed, and if so, | 
 |               under what circumstances. The specifica‐ | 
 |               tion of the checkpointing occasions with this option overwrites the | 
 |               definitions of the  when  parameter  in  the | 
 |               checkpointing  environment  (see  checkpoint(5)) referenced by the qsub | 
 |               -ckpt switch.  Possible values for occa‐ | 
 |               sion_specifier are | 
 |  | 
 |               n           no checkpoint is performed. | 
 |               s           checkpoint when batch server is shut down. | 
 |               m           checkpoint at minimum CPU interval. | 
 |               x           checkpoint when job gets suspended. | 
 |               <interval>  checkpoint in the specified time interval. | 
 |  | 
 |               The minimum CPU interval is defined in the queue configuration (see | 
 |               queue_conf(5) for details).  <interval>  has | 
 |               to  be specified in the format hh:mm:ss. | 
 |               The maximum of <interval> and the queue's minimum CPU interval is used | 
 |               if <interval> is specified. This is done to ensure that a machine is not | 
 |               overloaded by checkpoints being  generated too frequently. | 
 |  | 
 |               The  value specified with this option or the corresponding value specified | 
 |               in qmon will be passed to defined JSV | 
 |               instances.  The <interval> will be available as parameter with the  name  c_interval. | 
 |               The  character  sequence | 
 |               specified will be available as parameter with the name c_occasion. | 
 |               Please note that if you change c_occasion via | 
 |               JSV then the last setting of c_interval will be overwritten and vice versa. | 
 |               (see -jsv option below or find more | 
 |               information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-ckpt', | 
 |                                      metavar='ckpt_name', | 
 |                                      help="""\ | 
 |               Available for qsub and qalter only. | 
 |  | 
 |               Selects  the  checkpointing  environment (see checkpoint(5)) to be used | 
 |               for checkpointing the job. Also declares the job to be a checkpointing job. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then this | 
 |               value  will  be  passed  to  defined  JSV | 
 |               instances  as  parameter  with the name ckpt.  (see -jsv option below or | 
 |               find more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin']: | 
 |             self.parser.add_argument('-clear', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, and qlogin only. | 
 |  | 
 |               Causes all elements of the job to be reset to the initial default | 
 |               status prior to applying any modifications (if | 
 |               any) appearing in this specific command.""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('-cwd', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh and qalter only. | 
 |  | 
 |               Execute  the  job  from  the  current  working directory. | 
 |               This switch will activate Grid Engine's path aliasing | 
 |               facility, if the corresponding configuration files are present (see ge_aliases(5)). | 
 |  | 
 |               In the case of qalter, the previous definition of the current working | 
 |               directory will be overwritten if qalter is | 
 |               executed from a different directory than the preceding qsub or qalter. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified | 
 |               then this value  will  be  passed  to  defined  JSV | 
 |               instances  as  parameter with the name cwd. The value of this parameter | 
 |               will be the absolute path to the current | 
 |               working directory. JSV scripts can remove the path from jobs during the | 
 |               verification  process  by  setting  the | 
 |               value  of this parameter to an empty string. | 
 |               As a result the job behaves as if -cwd was not specified during job | 
 |               submission.  (see -jsv option below or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh']: | 
 |             self.parser.add_argument('-C', | 
 |                                      metavar='prefix_string', | 
 |                                      help="""\ | 
 |               Available for qsub and qrsh with script submission (-b n). | 
 |  | 
 |               Prefix_string defines the prefix that declares a directive in the  job's  command. | 
 |               The  prefix  is  not  a  job | 
 |               attribute,  but  affects  the  behavior  of  qsub  and qrsh. | 
 |               If prefix is a null string, the command will not be | 
 |               scanned for embedded directives. | 
 |               The directive prefix consists of two ASCII characters which, | 
 |               when appearing in the first two bytes of  a  script | 
 |               line, indicate that what follows is an Grid Engine command.  The default is "#$". | 
 |               The  user  should  be aware that changing the first delimiting character | 
 |               can produce unforeseen side effects. If | 
 |               the script file contains anything other than a "#" character in the first byte | 
 |               position of the line,  the  shell | 
 |               processor for the job will reject the line and may exit the job prematurely. | 
 |               If the -C option is present in the script file, it is ignored.""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-dc', | 
 |                                      action='append', | 
 |                                      metavar='variable', | 
 |                                      help="""\ | 
 |        -dc variable,... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Removes  the  given  variable(s)  from the job's context.  Multiple -ac, -dc, and | 
 |               -sc options may be given.  The order is important. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               The outcome of the evaluation of all -ac, -dc, and -sc options or corresponding | 
 |               values  in  qmon  is  passed  to | 
 |               defined JSV instances as parameter with the name ac.  (see -jsv option below or | 
 |               find more information concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsh', 'qrsh']: | 
 |             self.parser.add_argument('-display', | 
 |                                      metavar='display_specifier', | 
 |                                      help="""\ | 
 |               Available for qsh and qrsh. | 
 |  | 
 |               Directs xterm(1) to use display_specifier in order to contact the X server. | 
 |               The display_specifier has  to  con‐ | 
 |               tain  the  hostname  part  of the display name (e.g. myhost:1). | 
 |               Local display names (e.g. :0) cannot be used in | 
 |               grid environments.  Values set with the -display option overwrite settings | 
 |               from the submission  environment  and | 
 |               from -v command line options. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified then this | 
 |               value will be passed to defined JSV | 
 |               instances as parameter with the name display. This value will also be available | 
 |               in  the  job  environment  which | 
 |               might  optionally  be  passed to JSV scripts. The variable name will be DISPLAY. | 
 |               (see -jsv option below or find | 
 |               more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-dl', | 
 |                                      metavar='date_time', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Specifies the deadline initiation time in [[CC]YY]MMDDhhmm[.SS] format (see -a | 
 |               option above). The deadline  ini‐ | 
 |               tiation time is the time at which a deadline job has to reach top priority to be | 
 |               able to complete within a given | 
 |               deadline. Before the deadline initiation time the priority of a deadline job | 
 |               will be raised  steadily  until  it | 
 |               reaches the maximum as configured by the Grid Engine administrator. | 
 |  | 
 |               This option is applicable only for users allowed to submit deadline jobs. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified then this | 
 |               value will be passed to defined JSV | 
 |               instances as parameter with the name dl. The format for the date_time value | 
 |               is CCYYMMDDhhmm.SS (see -jsv  option | 
 |               below or find more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-e', | 
 |                                      metavar='path', | 
 |                                      help="""\ | 
 |           -e [[hostname]:]path,... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines  or  redefines the path used for the standard error stream of the job. | 
 |               For qsh, qrsh and qlogin only the | 
 |               standard error stream of prolog and epilog is redirected.  If the path | 
 |               constitutes an absolute  path  name,  the | 
 |               error-path  attribute  of  the  job  is  set to path, including the hostname. | 
 |               If the path name is relative, Grid | 
 |               Engine expands path either with the current working directory path | 
 |               (if the -cwd switch (see above) is also spec‐ | 
 |               ified)  or with the home directory path. If hostname is present, | 
 |               the standard error stream will be placed in the | 
 |               corresponding location only if the job runs on the specified host. | 
 |               If the path contains a ":"  without  a  host‐ | 
 |               name, a leading ":" has to be specified. | 
 |  | 
 |               By  default  the  file name for interactive jobs is /dev/null. | 
 |               For batch jobs the default file name has the form | 
 |               job_name.ejob_id and job_name.ejob_id.task_id for array job tasks (see -t option | 
 |               below). | 
 |  | 
 |               If path is a directory, the standard error stream of the job will be put | 
 |               in this  directory  under  the  default | 
 |               file  name.  If the pathname contains certain pseudo environment variables, | 
 |               their value will be expanded at run‐ | 
 |               time of the job and will be used to constitute the standard error stream path name. | 
 |               The following  pseudo  envi‐ | 
 |               ronment variables are supported currently: | 
 |  | 
 |               $HOME       home directory on execution machine | 
 |               $USER       user ID of job owner | 
 |               $JOB_ID     current job ID | 
 |               $JOB_NAME   current job name (see -N option) | 
 |               $HOSTNAME   name of the execution host | 
 |               $TASK_ID    array job task index number | 
 |  | 
 |               Alternatively  to  $HOME  the tilde sign "~" can be used as common in csh(1) | 
 |               or ksh(1).  Note, that the "~" sign | 
 |               also works in combination with user names, so that "~<user>" expands to the | 
 |               home  directory  of  <user>.  Using | 
 |               another user ID than that of the job owner requires corresponding permissions, | 
 |               of course. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then this value | 
 |               will  be  passed  to  defined  JSV | 
 |               instances  as  parameter  with  the  name  e.  (see -jsv option below or | 
 |               find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-hard', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Signifies that all -q and -l resource requirements following in the command | 
 |               line will be hard  requirements  and | 
 |               must be satisfied in full before a job can be scheduled. | 
 |               As Grid Engine scans the command line and script file for Grid Engine options | 
 |               and parameters it builds a list of | 
 |               resources required by a job. All such resource requests are considered as | 
 |               absolutely essential for  the  job  to | 
 |               commence. If the -soft option (see below) is encountered during the scan then | 
 |               all following resources are desig‐ | 
 |               nated as "soft requirements" for execution, or "nice-to-have, but not essential". | 
 |               If the -hard flag  is  encoun‐ | 
 |               tered  at a later stage of the scan, all resource requests following it once again | 
 |               become "essential". The -hard | 
 |               and -soft options in effect act as "toggles" during the scan. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then the corresponding | 
 |               -q and -l resource  require‐ | 
 |               ments  will  be passed to defined JSV instances as parameter with the names | 
 |               q_hard and l_hard. Find for informa‐ | 
 |               tion in the sections describing -q and -l.  (see -jsv option below or find | 
 |               more information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter', 'qresub']: | 
 |             # NOTE in SGE this is -h, here I have renamed it to -hold | 
 |             # TODO check if multiple holds are parsed correctly | 
 |             self.parser.add_argument('-hold', | 
 |                                      choices='usonUOS', | 
 |                                      help="""\ | 
 |               NOTE: Originally defined as -h, but changed to -hold here. | 
 |  | 
 |               Available for qsub (only -h), qrsh, qalter and qresub (hold state is | 
 |               removed when not set explicitly). | 
 |  | 
 |               List of holds to place on a job, a task or some tasks of a job. | 
 |  | 
 |               `u'  denotes a user hold. | 
 |               `s'  denotes a system hold. | 
 |               `o'  denotes a operator hold. | 
 |               `n'  denotes no hold (requires manager privileges). | 
 |  | 
 |               As  long  as  any hold other than `n' is assigned to the job the job is | 
 |               not eligible for execution. Holds can be | 
 |               released via qalter and qrls(1).  In case of qalter this is supported | 
 |               by the following additional option  speci‐ | 
 |               fiers for the -h switch: | 
 |  | 
 |               `U'  removes a user hold. | 
 |               `S'  removes a system hold. | 
 |               `O'  removes a operator hold. | 
 |  | 
 |               Grid  Engine managers can assign and remove all hold types, | 
 |               Grid Engine operators can assign and remove user and | 
 |               operator holds, and users can only assign or remove user holds. | 
 |  | 
 |               In the case of qsub only user holds can be placed on a job and thus | 
 |               only the first form of the option  with  the | 
 |               -h switch alone is allowed.  As opposed to this, qalter requires | 
 |               the second form described above. | 
 |  | 
 |               An alternate means to assign hold is provided by the qhold(1) facility. | 
 |  | 
 |               If the job is a array job (see the -t option below), all tasks specified via | 
 |               -t are affected by the -h operation | 
 |               simultaneously. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If  this  option  is specified with qsub or during the submission | 
 |               of a job in qmon then the parameter h with the | 
 |               value u will be passed to the defined JSV instances indicating that | 
 |               the job will be in user hold after the  sub‐ | 
 |               mission finishes.  (see -jsv option below or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('-hold_jid', | 
 |                                      nargs='+', | 
 |                                      metavar='wc_job_list', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh, and qalter only. See sge_types(1). | 
 |               for wc_job_list definition. | 
 |  | 
 |               Defines  or  redefines  the job dependency list of the submitted job. | 
 |               A reference by job name or pattern is only | 
 |               accepted if the referenced job is owned by the same user as the referring job. | 
 |               The submitted job is not eligible | 
 |               for  execution unless all jobs referenced in the comma-separated job id and/or | 
 |               job name list have completed.  If | 
 |               any of the referenced jobs exits with exit code 100, the submitted | 
 |               job will remain ineligible for execution. | 
 |  | 
 |               With the help of job names or regular pattern one can specify a job | 
 |               dependency on multiple jobs  satisfying  the | 
 |               regular  pattern  or  on all jobs with the requested name. | 
 |               The name dependencies are resolved at submit time and | 
 |               can only be changed via qalter. New jobs or name changes | 
 |               of other jobs will not be taken into account. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified | 
 |               then this value will be passed to defined JSV | 
 |               instances as parameter with the name hold_jid. | 
 |               (see -jsv option below or find more information  concerning  JSV | 
 |               in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('-hold_jid_ad', | 
 |                                      nargs='+', | 
 |                                      metavar='wc_job_list', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh, and qalter only. See sge_types(1). | 
 |               for wc_job_list definition. | 
 |  | 
 |               Defines  or  redefines the job array dependency list of | 
 |               the submitted job. A reference by job name or pattern is | 
 |               only accepted if the referenced job is owned by the same | 
 |               user as the referring job. Each sub-task of the submit‐ | 
 |               ted  job  is  not eligible for execution unless the corresponding | 
 |               sub-tasks of all jobs referenced in the comma- | 
 |               separated job id and/or job name list have completed. | 
 |               If any array task of the referenced jobs exits with  exit | 
 |               code 100, the dependent tasks of the submitted job will remain | 
 |               ineligible for execution. | 
 |  | 
 |               With  the  help of job names or regular pattern one can specify | 
 |               a job dependency on multiple jobs satisfying the | 
 |               regular pattern or on all jobs with the requested name. | 
 |               The name dependencies are resolved at  submit  time  and | 
 |               can only be changed via qalter. New jobs or name changes of other | 
 |               jobs will not be taken into account. | 
 |  | 
 |               If  either  the submitted job or any job in wc_job_list are | 
 |               not array jobs with the same range of sub-tasks (see | 
 |               -t option below), the request list will be rejected and the | 
 |               job create or modify operation will error. | 
 |  | 
 |               qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is | 
 |               specified then this value will be passed to defined JSV | 
 |               instances as parameter with the name hold_jid_ad. | 
 |               (see -jsv option below or find  more  information  concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-i', | 
 |                                      metavar='file', | 
 |                                      help="""\ | 
 |        -i [[hostname]:]file,... | 
 |               Available for qsub, and qalter only. | 
 |  | 
 |               Defines or redefines the file used for the standard input stream of | 
 |               the job. If the file constitutes an absolute | 
 |               filename, the input-path attribute of the job is set to path, | 
 |               including the hostname. If the path name is  rela‐ | 
 |               tive, Grid Engine expands path either with the current working | 
 |               directory path (if the -cwd switch (see above) is | 
 |               also specified) or with the home directory path. If hostname is present, | 
 |               the  standard  input  stream  will  be | 
 |               placed  in  the  corresponding  location  only if the job runs | 
 |               on the specified host. If the path contains a ":" | 
 |               without a hostname, a leading ":" has to be specified. | 
 |  | 
 |               By default /dev/null is the input stream for the job. | 
 |  | 
 |               It is possible to use certain pseudo variables, whose values | 
 |               will be expanded at runtime of the job and will  be | 
 |               used to express the standard input stream as described in | 
 |               the -e option for the standard error stream. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then | 
 |               this value  will  be  passed  to  defined  JSV | 
 |               instances  as  parameter  with  the  name  i. | 
 |               (see -jsv option below or find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qrsh', 'qmake']: | 
 |             self.parser.add_argument('-inherit', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available only for qrsh and qmake(1). | 
 |  | 
 |               qrsh allows the user to start a task in an already scheduled parallel job. | 
 |               The option -inherit  tells  qrsh  to | 
 |               read a job id from the environment variable JOB_ID and start the | 
 |               specified command as a task in this job. Please | 
 |               note that in this case, the hostname of the host where the command | 
 |               will be executed must precede the command  to | 
 |               execute; the syntax changes to | 
 |  | 
 |               qrsh -inherit [ other options ] hostname command [ command_args ] | 
 |  | 
 |               Note also, that in combination with -inherit, most other command line | 
 |               options will be ignored.  Only the options | 
 |               -verbose, -v and -V will be interpreted.  As a replacement to option | 
 |               -cwd please use -v PWD. | 
 |  | 
 |               Usually a task should have the same environment (including the | 
 |               current working directory) as  the  corresponding | 
 |               job, so specifying the option -V should be suitable for most applications. | 
 |  | 
 |               Note:  If  in  your  system  the qmaster tcp port is not configured as a service, | 
 |               but rather via the environment | 
 |               variable GE_QMASTER_PORT, make sure that this variable is set in the | 
 |               environment when calling qrsh or qmake with | 
 |               the  -inherit  option.  If  you  call  qrsh  or  qmake with the | 
 |               -inherit option from within a job script, export | 
 |               GE_QMASTER_PORT with the option "-v GE_QMASTER_PORT" either as | 
 |               a command argument or an embedded directive. | 
 |  | 
 |               This parameter is not available in the JSV context. | 
 |               (see -jsv option below or find more information  concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-j', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Specifies whether or not the standard error stream of the job | 
 |               is merged into the standard output stream. | 
 |               If both the -j y and the -e options are present, | 
 |               Grid Engine sets but ignores the error-path attribute. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |  | 
 |               The value specified with this option or the corresponding | 
 |               value specified in qmon will only be passed to defined | 
 |               JSV instances if the value is yes.  The name of the parameter will be j. | 
 |               The value will be y also when then long | 
 |               form yes was specified during submission. | 
 |               (see -jsv option below or find more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-js', | 
 |                                      nargs='?', | 
 |                                      type=int, | 
 |                                      metavar='job_share', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines  or  redefines the job share of the job relative to other jobs. | 
 |               Job share is an unsigned integer value. | 
 |               The default job share value for jobs is 0. | 
 |  | 
 |               The job share influences the Share Tree Policy and the Functional Policy. | 
 |               It has no effect on  the  Urgency  and | 
 |               Override  Policies  (see  share_tree(5), sched_conf(5) and the | 
 |               Grid Engine Installation and Administration Guide | 
 |               for further information on the resource management policies supported | 
 |               by Grid Engine). | 
 |  | 
 |               In case of the Share Tree Policy, users can distribute the tickets to | 
 |               which they are  currently  entitled  among | 
 |               their  jobs  using different shares assigned via -js. | 
 |               If all jobs have the same job share value, the tickets are | 
 |               distributed evenly. Otherwise, jobs receive tickets relative | 
 |               to the different job shares. Job shares are treated | 
 |               like an additional level in the share tree in the latter case. | 
 |  | 
 |               In  connection  with  the  Functional Policy, the job share can be | 
 |               used to weight jobs within the functional job | 
 |               category.  Tickets are distributed relative to any uneven | 
 |               job share distribution treated as a virtual share dis‐ | 
 |               tribution level underneath the functional job category. | 
 |  | 
 |               If  both  the  Share Tree and the Functional Policy are active, | 
 |               the job shares will have an effect in both poli‐ | 
 |               cies, and the tickets independently derived in each of them are | 
 |               added to the total number of  tickets  for  each | 
 |               job. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified | 
 |               then this value will be passed to defined JSV | 
 |               instances as parameter with the name js.  (see -jsv option below or | 
 |               find  more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin']: | 
 |             self.parser.add_argument('-jsv', | 
 |                                      metavar='jsv_url', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh and qlogin only. | 
 |  | 
 |               Defines  a  client JSV instance which will be executed to | 
 |               verify the job specification before the job is sent to | 
 |               qmaster. | 
 |  | 
 |               In contrast to other options this switch will not be overwritten | 
 |               if  it  is  also  used  in  sge_request  files. | 
 |               Instead all specified JSV instances will be executed to verify | 
 |               the job to be submitted. | 
 |  | 
 |               The  JSV  instance  which is directly passed with the commandline | 
 |               of a client is executed as first to verify the | 
 |               job specification. After that the JSV instance which might have | 
 |               been defined in various sge_request  files  will | 
 |               be triggered to check the job. Find more details | 
 |               in man page jsv(1) and sge_request(5). | 
 |  | 
 |               The syntax of the jsv_url is specified in sge_types(1).()""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-l', | 
 |                                      metavar='keywords', | 
 |                                      help="""\ | 
 |        -l resource=value,... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Launch  the  job in a Grid Engine queue meeting the given resource | 
 |               request list.  In case of qalter the previous | 
 |               definition is replaced by the specified one. | 
 |  | 
 |               complex(5) describes how a list of available resources and  their | 
 |               associated  valid  value  specifiers  can  be | 
 |               obtained. | 
 |  | 
 |               There  may  be  multiple -l switches in a single command. | 
 |               You may request multiple -l options to be soft or hard | 
 |               both in the same command line. In case of a serial job multiple | 
 |               -l switches refine the definition for the sought | 
 |               queue. | 
 |  | 
 |               Qalter  allows  changing the value of this option even while the | 
 |               job is running, but only if the initial list of | 
 |               resources does not contain a resource that is marked as consumable. | 
 |               However the modification will only be effec‐ | 
 |               tive after a restart or migration of the job. | 
 |  | 
 |               If  this option or a corresponding value in qmon is specified the | 
 |               these hard and soft resource requirements will | 
 |               be passed to defined JSV instances as parameter with the names | 
 |               l_hard and l_soft. If regular expressions will be | 
 |               used  for  resource requests, then these expressions will | 
 |               be passed as they are. Also shortcut names will not be | 
 |               expanded.  (see -jsv option above or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             # TODO check if multiple arguments are parsed correctly | 
 |             self.parser.add_argument('-m', | 
 |                                      nargs='+', | 
 |                                      choices='beasn', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines or redefines under which circumstances mail | 
 |               is to be sent to the job owner or to the users defined  with | 
 |               the -M option described below. The option arguments | 
 |               have the following meaning: | 
 |  | 
 |               `b'     Mail is sent at the beginning of the job. | 
 |               `e'     Mail is sent at the end of the job. | 
 |               `a'     Mail is sent when the job is aborted or | 
 |                       rescheduled. | 
 |               `s'     Mail is sent when the job is suspended. | 
 |               `n'     No mail is sent. | 
 |  | 
 |               Currently no mail is sent when a job is suspended. | 
 |  | 
 |               Qalter  allows  changing the b, e, and a option arguments | 
 |               even while the job executes. The modification of the b | 
 |               option argument will only be in effect after a restart | 
 |               or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is | 
 |               specified then this value  will  be  passed  to  defined  JSV | 
 |               instances as parameter with the name m.  (see -jsv option | 
 |               above or find more information concerning JSV in""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-M', | 
 |                                      metavar='user[@host]', | 
 |                                      help="""\ | 
 |        -M user[@host],... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines or redefines the list of users to which the server | 
 |               that executes the job has to send mail, if the server | 
 |               sends mail about the job.  Default is the job owner at the originating host. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then | 
 |               this value  will  be  passed  to  defined  JSV | 
 |               instances  as  parameter  with  the  name  M.  (see -jsv option above or | 
 |               find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-masterq', | 
 |                                      nargs='+', | 
 |                                      metavar='wc_queue_list', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh, qsh, qlogin and qalter.  Only meaningful | 
 |               for parallel jobs, i.e. together with the -pe option. | 
 |  | 
 |               Defines or redefines a list of cluster queues, queue domains and | 
 |               queue instances which may be used to become the | 
 |               so called master queue of this parallel job. A more detailed | 
 |               description  of  wc_queue_list  can  be  found  in | 
 |               sge_types(1).   The  master queue is defined as the queue where | 
 |               the parallel job is started. The other queues to | 
 |               which the parallel job spawns tasks are called slave queues. | 
 |               A parallel job only has one master queue. | 
 |  | 
 |               This parameter has all the properties of a resource request | 
 |               and will be merged with  requirements  derived  from | 
 |               the -l option described above. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified | 
 |               the this hard resource requirement will  be  passed | 
 |               to  defined  JSV  instances as parameter with the name masterq. | 
 |               (see -jsv option above or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('-notify', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh (with command) and qalter only. | 
 |  | 
 |               This flag, when set causes Grid Engine to send "warning" signals | 
 |               to a running job prior to sending  the  signals | 
 |               themselves.  If  a  SIGSTOP  is pending, the job will receive | 
 |               a SIGUSR1 several seconds before the SIGSTOP. If a | 
 |               SIGKILL is pending, the job will receive a SIGUSR2 several | 
 |               seconds before the SIGKILL.  This option provides the | 
 |               running  job, before receiving the SIGSTOP or SIGKILL, | 
 |               a configured time interval to do e.g. cleanup operations. | 
 |               The amount of time delay is controlled by the notify parameter | 
 |               in each queue configuration (see queue_conf(5)). | 
 |  | 
 |               Note that the Linux operating system "misused" the user | 
 |               signals SIGUSR1 and SIGUSR2 in some early  Posix  thread | 
 |               implementations.  You might not want to use the | 
 |               -notify option if you are running multi-threaded applications in | 
 |               your jobs under Linux, particularly on 2.0 or earlier kernels. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               Only if this option is used the parameter named notify with | 
 |               the value y will be passed to defined JSV instances. | 
 |               (see -jsv option above or find more information concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin']: | 
 |             self.parser.add_argument('-now', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qlogin and qrsh. | 
 |  | 
 |               -now y tries to start the job immediately or not at all. | 
 |               The command returns 0 on success, or 1 on failure (also | 
 |               if the job could not be scheduled immediately). | 
 |               For array jobs submitted with the -now  option,  if  all  tasks | 
 |               cannot be immediately scheduled, no tasks are scheduled. | 
 |               -now y is default for qsh, qlogin and qrsh | 
 |  | 
 |               With  the -now n option, the job will be put into the pending | 
 |               queue if it cannot be executed immediately. -now n | 
 |               is default for qsub. | 
 |  | 
 |               The value specified with this option or the corresponding | 
 |               value specified in qmon will only be passed to defined | 
 |               JSV  instances  if  the value is yes.  The name of the | 
 |               parameter will be now. The value will be y also when then | 
 |               long form yes was specified during submission. | 
 |               (see -jsv option above or find more information  concerning  JSV | 
 |               in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-N', | 
 |                                      metavar='name', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               The  name  of  the job. The name should follow the "name" | 
 |               definition in sge_types(1).  Invalid job names will be | 
 |               denied at submit time. | 
 |  | 
 |               If the -N option is not present, Grid Engine assigns | 
 |               the name of the job script to the job after  any  directory | 
 |               pathname has been removed from the script-name. | 
 |               If the script is read from standard input, the job name defaults | 
 |               to STDIN. | 
 |  | 
 |               In the case of qsh or qlogin with the -N option is absent, | 
 |  | 
 |               the string `INTERACT' is assigned to the job. | 
 |  | 
 |               In the case of qrsh if the -N option is absent, the resulting | 
 |               job name is determined from the qrsh command  line | 
 |               by  using the argument string up to the first | 
 |               occurrence of a semicolon or whitespace and removing the directory | 
 |               pathname. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               The value specified with this option or the corresponding value | 
 |               specified in qmon will be passed to defined  JSV | 
 |               instances  as  parameter  with  the  name  N.  (see -jsv | 
 |               option above or find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qrsh']: | 
 |             self.parser.add_argument('-noshell', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available only for qrsh with a command line. | 
 |  | 
 |               Do not start the command line given to qrsh in a user's login shell, | 
 |               i.e.   execute  it  without  the  wrapping | 
 |               shell. | 
 |  | 
 |               This  option  can  be used to speed up execution as some overhead, | 
 |               like the shell startup and sourcing the shell | 
 |               resource files, is avoided. | 
 |  | 
 |               This option can only be used if no shell-specific command line | 
 |               parsing is required. If the command line contains | 
 |               shell  syntax  like environment variable substitution or (back) quoting, | 
 |               a shell must be started.  In this case, | 
 |               either do not use the -noshell option or include the shell call in the command line. | 
 |  | 
 |               Example: | 
 |               qrsh echo '$HOSTNAME' | 
 |               Alternative call with the -noshell option | 
 |               qrsh -noshell /bin/tcsh -f -c 'echo $HOSTNAME'""") | 
 |  | 
 |         if prog in ['qrsh']: | 
 |             self.parser.add_argument('-nostdin', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available only for qrsh. | 
 |  | 
 |               Suppress the input stream STDIN - qrsh will pass the option -n | 
 |               to the rsh(1) command. This is especially useful, | 
 |               if  multiple tasks are executed in parallel using qrsh, e.g. | 
 |               in a make(1) process - it would be undefined, which | 
 |               process would get the input.""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-o', | 
 |                                      metavar='path', | 
 |                                      help="""\ | 
 |        -o [[hostname]:]path,... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               The path used for the standard output stream of the job. | 
 |               The path is handled as described in the -e  option  for | 
 |               the standard error stream. | 
 |  | 
 |               By  default  the  file  name  for standard output has the | 
 |               form job_name.ojob_id and job_name.ojob_id.task_id for | 
 |               array job tasks (see -t option below). | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is | 
 |               specified then this value will be passed to defined JSV | 
 |               instances as parameter with the name o.  (see -jsv option | 
 |               above or  find  more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qalter']: | 
 |             self.parser.add_argument('-ot', | 
 |                                      metavar='override_tickets', | 
 |                                      help="""\ | 
 |               Available for qalter only. | 
 |  | 
 |               Changes the number of override tickets for the specified job. | 
 |               Requires manager/operator privileges.""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-P', | 
 |                                      metavar='project_name', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Specifies  the  project  to which this job is assigned. | 
 |               The administrator needs to give permission to individual | 
 |               users to submit jobs to a specific project. (see -aprj option to qconf(1)). | 
 |  | 
 |               If this option or a corresponding value in qmon is specified then | 
 |               this value  will  be  passed  to  defined  JSV | 
 |               instances  as  parameter  with  the  name ot.  (see -jsv option | 
 |               above or find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-p', | 
 |                                      metavar='priority', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines or redefines the priority of the job relative to other jobs. | 
 |               Priority is an integer in the range  -1023 | 
 |               to 1024.  The default priority value for jobs is 0. | 
 |  | 
 |               Users  may  only decrease the priority of their jobs. | 
 |               Grid Engine managers and administrators may also increase | 
 |               the priority associated with jobs. If a pending job has higher priority, | 
 |               it is earlier eligible for  being  dis‐ | 
 |               patched by the Grid Engine scheduler. | 
 |  | 
 |               If  this  option or a corresponding value in qmon is specified and | 
 |               the priority is not 0 then this value will be | 
 |               passed to defined JSV instances as parameter with the name p. | 
 |               (see -jsv option above or find  more  information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-slot', | 
 |                                      metavar='slot', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Defines or redefines the priority of the job relative to other jobs. | 
 |               Priority is an integer in the range  -1023 | 
 |               to 1024.  The default priority value for jobs is 0. | 
 |  | 
 |               Users  may  only decrease the priority of their jobs. | 
 |               Grid Engine managers and administrators may also increase | 
 |               the priority associated with jobs. If a pending job has higher priority, | 
 |               it is earlier eligible for  being  dis‐ | 
 |               patched by the Grid Engine scheduler. | 
 |  | 
 |               If  this  option or a corresponding value in qmon is specified and | 
 |               the priority is not 0 then this value will be | 
 |               passed to defined JSV instances as parameter with the name p. | 
 |               (see -jsv option above or find  more  information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qrsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-pe', | 
 |                                      nargs=2, | 
 |                                      metavar=('parallel_environment', 'n'), | 
 |                                      help="""\ | 
 |        -pe parallel_environment n[-[m]]|[-]m,... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Parallel programming environment (PE) to instantiate. | 
 |               For more detail about PEs, please see the sge_types(1). | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified | 
 |               then the parameters pe_name, pe_min and pe_max will | 
 |               be  passed to configured JSV instances where pe_name will be the | 
 |               name of the parallel environment and the values | 
 |               pe_min and pe_max represent the values n and m which have been | 
 |               provided with the -pe option. A missing  specifi‐ | 
 |               cation  of  m  will be expanded as value 9999999 in JSV scripts | 
 |               and it represents the value infinity.  (see -jsv | 
 |               option above or find more information concerning JSV in jsv(1))""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qrsh', 'qlogin']: | 
 |             self.parser.add_argument('-pty', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qrsh and qlogin only. | 
 |  | 
 |               -pty yes enforces the job to be started in a pseudo terminal (pty). | 
 |               If no pty is available, the job start fails. | 
 |               -pty  no  enforces the job to be started without a pty. | 
 |               By default, qrsh without a command and qlogin start the | 
 |               job in a pty, qrsh with a command starts the job without a pty. | 
 |  | 
 |               This parameter is not available in the JSV context. | 
 |               (see -jsv option above or find more information  concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-q', | 
 |                                      nargs='+', | 
 |                                      metavar='wc_queue_list', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh, qsh, qlogin and qalter. | 
 |  | 
 |               Defines  or  redefines  a  list of cluster queues, | 
 |               queue domains or queue instances which may be used to execute | 
 |               this job. Please find a description of wc_queue_list in sge_types(1). | 
 |               This parameter has all the properties  of | 
 |               a resource request and will be merged with requirements derived from the | 
 |               -l option described above. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               If this option or a corresponding value in qmon is specified | 
 |               the these hard and soft resource requirements  will | 
 |               be  passed  to defined JSV instances as parameters with the | 
 |               names q_hard and q_soft. If regular expressions will | 
 |               be used for resource requests, then these expressions will | 
 |               be passed as they are. Also shortcut names  will  not | 
 |               be expanded.  (see -jsv option above or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-R', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh, qsh, qlogin and qalter. | 
 |  | 
 |               Indicates  whether a reservation for this job should be done. | 
 |               Reservation is never done for immediate jobs, i.e. | 
 |               jobs submitted using the -now yes option.  Please note that | 
 |               regardless of the reservation request, job  reserva‐ | 
 |               tion  might  be disabled using max_reservation in sched_conf(5) | 
 |               and might be limited only to a certain number of | 
 |               high priority jobs. | 
 |  | 
 |               By default jobs are submitted with the -R n option. | 
 |  | 
 |               The value specified with this option or the corresponding value | 
 |               specified in qmon will only be passed to defined | 
 |               JSV instances if the value is yes.  The name of the parameter will be R. | 
 |               The value will be y also when then long | 
 |               form yes was specified during submission. | 
 |               (see -jsv option above or find more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-r', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub and qalter only. | 
 |  | 
 |               Identifies  the  ability of a job to be rerun or not. | 
 |               If the value of -r is 'yes', the job will be rerun if the | 
 |               job was aborted without leaving a consistent exit state. | 
 |               (This is typically the case if the node on  which  the | 
 |               job is running crashes).  If -r is 'no', | 
 |               the job will not be rerun under any circumstances. | 
 |               Interactive jobs submitted with qsh, qrsh or qlogin are not rerunnable. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               The value specified with this option or the corresponding value specified | 
 |               in qmon will only be passed to defined | 
 |               JSV instances if the value is yes.  The name of the parameter will be r. | 
 |               The value will be y also when then long | 
 |               form  yes  was  specified  during submission.  (see -jsv option above or | 
 |               find more information concerning JSV in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-sc', | 
 |                                      action='append', | 
 |                                      metavar='variable[=value]', | 
 |                                      help="""\ | 
 |        -sc variable[=value],... | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Sets the given name/value pairs as the job's context. Value may be omitted. | 
 |               Grid Engine replaces the job's  pre‐ | 
 |               viously  defined  context  with the one given as the argument. | 
 |               Multiple -ac, -dc, and -sc options may be given. | 
 |               The order is important. | 
 |  | 
 |               Contexts provide a way to dynamically attach and remove meta-information | 
 |               to and from a job.  The  context  vari‐ | 
 |               ables are not passed to the job's execution context in its environment. | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |  | 
 |               The  outcome  of  the  evaluation  of all -ac, -dc, and -sc options | 
 |               or corresponding values in qmon is passed to | 
 |               defined JSV instances as parameter with the name ac. | 
 |               (see -jsv option above or find more information concerning | 
 |               JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub']: | 
 |             self.parser.add_argument('-shell', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available only for qsub. | 
 |  | 
 |               -shell  n causes qsub to execute the command line directly, | 
 |               as if by exec(2).  No command shell will be executed | 
 |               for the job.  This option only applies when -b y is also used. | 
 |               Without -b y, -shell n has no effect. | 
 |  | 
 |               This option can be used to speed up execution as some overhead, | 
 |               like the shell startup and  sourcing  the  shell | 
 |               resource files is avoided. | 
 |  | 
 |               This option can only be used if no shell-specific command line parsing | 
 |               is required. If the command line contains | 
 |               shell syntax, like environment variable substitution or (back) quoting, | 
 |               a shell must be started.  In  this  case | 
 |               either  do  not  use  the -shell n option or execute the shell as the | 
 |               command line and pass the path to the exe‐ | 
 |               cutable as a parameter. | 
 |  | 
 |               If a job executed with the -shell n option fails due to a user error, | 
 |               such as an invalid path to the executable, | 
 |               the job will enter the error state. | 
 |  | 
 |               -shell y cancels the effect of a previous -shell n.  Otherwise, it has no effect. | 
 |  | 
 |               See -b and -noshell for more information. | 
 |  | 
 |               The value specified with this option or the corresponding value | 
 |               specified in qmon will only be passed to defined | 
 |               JSV instances if the value is yes.  The name of the parameter | 
 |               will be shell. The value will be y also when  then | 
 |               long  form  yes was specified during submission. | 
 |               (see -jsv option above or find more information concerning JSV | 
 |               in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-soft', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter only. | 
 |  | 
 |               Signifies that all resource requirements following in the command | 
 |               line will be soft requirements and are  to  be | 
 |               filled on an "as available" basis. | 
 |               As  Grid  Engine scans the command line and script file for | 
 |               Grid Engine options and parameters, it builds a list | 
 |               of resources required by the job. All such resource requests are | 
 |               considered as absolutely essential for the  job | 
 |               to  commence.  If the -soft option is encountered during the | 
 |               scan then all following resources are designated as | 
 |               "soft requirements" for execution, or "nice-to-have, but not essential". | 
 |               If  the  -hard  flag  (see  above)  is | 
 |               encountered  at a later stage of the scan, all resource requests following | 
 |               it once again become "essential". The | 
 |               -hard and -soft options in effect act as "toggles" during the scan. | 
 |  | 
 |               If this option or a corresponding value in qmon is | 
 |               specified then the corresponding -q and -l resource  require‐ | 
 |               ments  will  be passed to defined JSV instances as parameter | 
 |               with the names q_soft and l_soft. Find for informa‐ | 
 |               tion in the sections describing -q and -l.  (see -jsv option | 
 |               above or find more information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub']: | 
 |             self.parser.add_argument('-sync', | 
 |                                      choices=yesno, | 
 |                                      help="""\ | 
 |               Available for qsub. | 
 |  | 
 |               -sync  y  causes qsub to wait for the job to complete before exiting. | 
 |               If the job completes successfully, qsub's | 
 |               exit code will be that of the completed job. | 
 |               If the job fails to complete successfully, qsub will print  out  a | 
 |               error  message indicating why the job failed and will have an exit code of 1. | 
 |               If qsub is interrupted, e.g. with | 
 |               CTRL-C, before the job completes, the job will be canceled. | 
 |               With the -sync n option, qsub will exit with an exit code of 0 as soon as the | 
 |               job  is  submitted  successfully. | 
 |               -sync n is default for qsub. | 
 |               If  -sync  y is used in conjunction with -now y, qsub will behave | 
 |               as though only -now y were given until the job | 
 |               has been successfully scheduled, after which time qsub will behave | 
 |               as though only -sync y were given. | 
 |               If -sync y is used in conjunction with -t n[-m[:i]], qsub will | 
 |               wait for all the job's tasks to  complete  before | 
 |               exiting.  If all the job's tasks complete successfully, qsub's | 
 |               exit code will be that of the first completed job | 
 |               tasks with a non-zero exit code, or 0 if all job tasks exited | 
 |               with an exit code of 0.  If any of the job's tasks | 
 |               fail  to  complete  successfully, qsub will print out an | 
 |               error message indicating why the job task(s) failed and | 
 |               will have an exit code of 1.  If qsub is interrupted, | 
 |               e.g. with CTRL-C, before the job  completes,  all  of  the | 
 |               job's tasks will be canceled. | 
 |  | 
 |               Information  that  this  switch  was specified during | 
 |               submission is not available in the JSV context.  (see -jsv | 
 |               option above or find more information concerning JSV in jsv(1))""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qsub', 'qsh', 'qalter']: | 
 |             self.parser.add_argument('-S', | 
 |                                      metavar='pathname', | 
 |                                      help="""\ | 
 |        -S [[hostname]:]pathname,... | 
 |               Available for qsub, qsh and qalter. | 
 |  | 
 |               Specifies the interpreting shell for the job. | 
 |               Only one pathname component without a host specifier is valid  and | 
 |               only  one path name for a given host is allowed. | 
 |               Shell paths with host assignments define the interpreting shell | 
 |               for the job if the host is the execution host. | 
 |               The shell path without host specification is used if  the  execu‐ | 
 |               tion host matches none of the hosts in the list. | 
 |  | 
 |               Furthermore,  the  pathname  can be constructed with pseudo | 
 |               environment variables as described for the -e option | 
 |               above. | 
 |  | 
 |               In the case of qsh the specified shell path is used to | 
 |               execute the  corresponding  command  interpreter  in  the | 
 |               xterm(1)  (via its -e option) started on behalf of the interactive job. | 
 |               Qalter allows changing this option even | 
 |               while the job executes. The modified parameter will only be in effect | 
 |               after a restart or migration of  the  job, | 
 |               however. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is | 
 |               specified then this value will be passed to defined JSV | 
 |               instances as parameter with the name S.  (see -jsv option | 
 |               above or  find  more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if True or prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-t', | 
 |                                      metavar='n[-m[:s]]', | 
 |                                      help="""\ | 
 |               Available for qsub and qalter only. | 
 |  | 
 |               Submits a so called Array Job, i.e. an array of identical | 
 |               tasks being differentiated only by an index number and | 
 |               being treated by Grid Engine almost like a series of jobs. | 
 |               The option argument to -t  specifies  the  number  of | 
 |               array job tasks and the index number which will be associated with the tasks. | 
 |               The index numbers will be exported | 
 |               to the job tasks via the environment variable GE_TASK_ID. | 
 |               The option arguments n, m  and  s  will  be  available | 
 |               through the environment variables GE_TASK_FIRST, | 
 |               GE_TASK_LAST and  GE_TASK_STEPSIZE. | 
 |  | 
 |               Following restrictions apply to the values n and m: | 
 |  | 
 |                      1 <= n <= MIN(2^31-1, max_aj_tasks) | 
 |                      1 <= m <= MIN(2^31-1, max_aj_tasks) | 
 |                      n <= m | 
 |  | 
 |               max_aj_tasks is defined in the cluster configuration (see sge_conf(5)) | 
 |  | 
 |               The  task  id range specified in the option argument may be a single | 
 |               number, a simple range of the form n-m or a | 
 |               range with a step size. Hence, the task id range specified by | 
 |               2-10:2 would result in the task id indexes  2,  4, | 
 |               6,  8, and 10, for a total of 5 identical tasks, each with | 
 |               the environment variable GE_TASK_ID containing one of | 
 |               the 5 index numbers. | 
 |  | 
 |               All array job tasks inherit the same resource requests and | 
 |               attribute definitions as specified  in  the  qsub  or | 
 |               qalter  command  line,  except  for  the  -t  option. | 
 |               The tasks are scheduled independently and, provided enough | 
 |               resources exist, concurrently, very much like separate jobs. | 
 |               However, an array job or a sub-array there of  can | 
 |               be  accessed  as a single unit by commands like qmod(1) or qdel(1). | 
 |               See the corresponding manual pages for fur‐ | 
 |               ther detail. | 
 |  | 
 |               Array jobs are commonly used to execute the same type of operation | 
 |               on varying input data  sets  correlated  with | 
 |               the task index number. The number of tasks in a array job is unlimited. | 
 |  | 
 |               STDOUT and STDERR of array job tasks will be written into different | 
 |               files with the default location | 
 |  | 
 |               <jobname>.['e'|'o']<job_id>'.'<task_id> | 
 |  | 
 |               In order to change this default, the -e and -o options (see above) | 
 |               can be used together with the pseudo environ‐ | 
 |               ment variables $HOME, $USER, $JOB_ID, $JOB_NAME, $HOSTNAME, and $GE_TASK_ID. | 
 |  | 
 |               Note, that you can use the output redirection to divert the output | 
 |               of all tasks into  the  same  file,  but  the | 
 |               result of this is undefined. | 
 |  | 
 |               If  this  option  or  a  corresponding  value in qmon is specified | 
 |               then this value will be passed to defined JSV | 
 |               instances as parameters with the name t_min, t_max and t_step | 
 |               (see -jsv option above or  find  more  information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qalter']: | 
 |             self.parser.add_argument('-tc', | 
 |                                      type=int, | 
 |                                      metavar='max_running_tasks', | 
 |                                      help="""\ | 
 |               -allow  users to limit concurrent array job task | 
 |               execution. Parameter max_running_tasks specifies maximum number | 
 |               of simultaneously running tasks.  For example we have | 
 |               running SGE with 10 free slots. We call qsub -t 1-100  -tc | 
 |               2 jobscript. Then only 2 tasks will be scheduled to run even | 
 |               when 8 slots are free.""") | 
 |  | 
 |         if prog in ['qsub']: | 
 |             self.parser.add_argument('-terse', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub only. | 
 |  | 
 |               -terse  causes  the qsub to display only the job-id of the | 
 |               job being submitted rather than the regular "Your job | 
 |               ..." string.  In case of an error the error is reported on stderr as usual. | 
 |               This can be helpful for scripts which need to parse qsub output to get the job-id. | 
 |  | 
 |               Information that this switch was specified during submission | 
 |               is not available in the  JSV  context.   (see  -jsv | 
 |               option above or find more information concerning JSV in jsv(1))""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qalter']: | 
 |             self.parser.add_argument('-u', | 
 |                                      metavar='username', | 
 |                                      help="""\ | 
 |        -u username,... | 
 |               Available  for  qalter  only. Changes are only made | 
 |               on those jobs which were submitted by users specified in the | 
 |               list of usernames.  For managers it is possible to use | 
 |               the qalter -u '*' command  to  modify  all  jobs  of  all | 
 |               users. | 
 |  | 
 |               If you use the -u switch it is not permitted to | 
 |               specify an additional wc_job_range_list.""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('-v', | 
 |                                      metavar='variable[=value]', | 
 |                                      help="""\ | 
 |        -v variable[=value],... | 
 |               Available for qsub, qrsh (with command argument) and qalter. | 
 |  | 
 |               Defines  or  redefines  the environment | 
 |               variables to be exported to the execution context of the job.  If the -v | 
 |               option is present Grid Engine will add the | 
 |               environment variables defined as arguments to the switch and, option‐ | 
 |               ally, values of specified variables, to the execution context of the job. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               All environment variables specified with -v, -V or the | 
 |               DISPLAY variable provided with -display will be  exported | 
 |               to the defined JSV instances only optionally when this is | 
 |               requested explicitly during the job submission verifi‐ | 
 |               cation.  (see -jsv option above or find more information concerning JSV in jsv(1))""" | 
 |                                      ) | 
 |  | 
 |         if prog in ['qrsh', 'qmake']: | 
 |             self.parser.add_argument('-verbose', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available only for qrsh and qmake(1). | 
 |  | 
 |               Unlike qsh and qlogin, qrsh does not output any | 
 |               informational messages while establishing the session, compliant | 
 |               with  the  standard rsh(1) and rlogin(1) system calls. | 
 |               If the option -verbose is set, qrsh behaves like the qsh | 
 |               and qlogin commands, printing information about the | 
 |               process of establishing the rsh(1) or rlogin(1) session.""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-verify', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter. | 
 |  | 
 |               Instead of submitting a job, prints detailed information | 
 |               about the would-be job as though qstat(1) -j were used, | 
 |               including the effects of command-line parameters and | 
 |               the external environment.""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             # TODO parse acceptability of qrsh argument properly | 
 |             self.parser.add_argument('-V', | 
 |                                      action='store_true', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh with command and qalter. | 
 |  | 
 |               Specifies that all environment variables active within | 
 |               the qsub utility be exported to the context of the job. | 
 |  | 
 |               All  environment variables specified with -v, -V or the DISPLAY | 
 |               variable provided with -display will be exported | 
 |               to the defined JSV instances only optionally when this is | 
 |               requested explicitly during the job submission verifi‐ | 
 |               cation.  (see -jsv option above or find more information | 
 |               concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qlogin', 'qalter']: | 
 |             self.parser.add_argument('-w', | 
 |                                      choices='ewnpv', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh, qlogin and qalter. | 
 |  | 
 |               Specifies  a validation level applied to the job to be submitted | 
 |               (qsub, qlogin, and qsh) or the specified queued | 
 |               job (qalter).  The information displayed indicates whether the | 
 |               job can possibly be scheduled assuming  an  empty | 
 |               system  with no other jobs. Resource requests exceeding the | 
 |               configured maximal thresholds or requesting unavail‐ | 
 |               able resource attributes are possible causes for jobs to fail this validation. | 
 |  | 
 |               The specifiers e, w, n and v define the following validation modes: | 
 |  | 
 |               `e'  error - jobs with invalid requests will be | 
 |                    rejected. | 
 |               `w'  warning - only a warning will be displayed | 
 |                    for invalid requests. | 
 |               `n'  none - switches off validation; the default for | 
 |                    qsub, qalter, qrsh, qsh | 
 |                    and qlogin. | 
 |               `p'  poke - does not submit the job but prints a | 
 |                    validation report based on a cluster as is with | 
 |                    all resource utilizations in place. | 
 |               `v'  verify - does not submit the job but prints a | 
 |                    validation report based on an empty cluster. | 
 |  | 
 |               Note, that the necessary checks are performance consuming | 
 |               and hence the checking is switched off by default.  It | 
 |               should also be noted that load values are not taken | 
 |               into account with the verification since they are assumed to | 
 |               be too volatile. To cause -w e verification to be passed | 
 |               at submission time, it  is  possible  to  specify  non- | 
 |               volatile values (non-consumables) or maximum values | 
 |               (consumables) in complex_values.""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qsh', 'qalter']: | 
 |             self.parser.add_argument('-wd', | 
 |                                      metavar='working_dir', | 
 |                                      help="""\ | 
 |               Available for qsub, qsh, qrsh and qalter only. | 
 |  | 
 |               Execute  the  job  from  the  directory  specified in working_dir. | 
 |               This switch will activate Grid Engine's path | 
 |               aliasing facility, if the corresponding configuration files are present | 
 |               (see ge_aliases(5)). | 
 |  | 
 |               Qalter allows changing this option even while the job executes. | 
 |               The modified parameter will only  be  in  effect | 
 |               after  a  restart  or  migration  of  the  job,  however. | 
 |               The parameter value will be available in defined JSV | 
 |               instances as parameter with the name cwd (see -cwd switch above or | 
 |               find  more  information  concerning  JSV  in | 
 |               jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh']: | 
 |             self.parser.add_argument('command', | 
 |                                      help="""\ | 
 |               Available for qsub and qrsh only. | 
 |  | 
 |               The job's scriptfile or binary.  If not present or if the operand | 
 |               is the single-character string '-', qsub reads | 
 |               the script from standard input. | 
 |  | 
 |               The command will be available in defined JSV instances as parameter | 
 |               with the name CMDNAME (see -jsv option above | 
 |               or find more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsub', 'qrsh', 'qalter']: | 
 |             self.parser.add_argument('command_args', | 
 |                                      nargs='*', | 
 |                                      help="""\ | 
 |               Available for qsub, qrsh and qalter only. | 
 |  | 
 |               Arguments to the job. Not valid if the script is entered from standard input. | 
 |  | 
 |               Qalter  allows  changing  this option even while the job executes. | 
 |               The modified parameter will only be in effect | 
 |               after a restart or migration of the job, however. | 
 |  | 
 |               The number of command arguments is provided to configured | 
 |               JSV instances as parameter with the name CMDARGS. Also | 
 |               the  argument  values can by accessed. Argument names | 
 |               have the format CMDARG<number> where <number> is a integer | 
 |               between 0 and CMDARGS - 1.  (see -jsv option above or | 
 |               find more information concerning JSV in jsv(1))""") | 
 |  | 
 |         if prog in ['qsh']: | 
 |             self.parser.add_argument('xterm_args', | 
 |                                      nargs='*', | 
 |                                      help="""\ | 
 |               Available for qsh only. | 
 |  | 
 |               Arguments to the xterm(1) executable, as defined in the configuration. | 
 |               For details, refer to ge_conf(5)). | 
 |  | 
 |               Information concerning xterm_args will be available in JSV context as | 
 |               parameters  with  the  name  CMDARGS  and | 
 |               CMDARG<number>. Find more information above in section command_args. | 
 |               (see -jsv option above or find more infor‐ | 
 |               mation concerning JSV in jsv(1))""") | 
 |  | 
 |         # END SGE OPTION PARSER | 
 |  | 
 |         # Initialize with defaults | 
 |         self.parse('-cwd -V -j y -terse -pe lammpi 1 echo') | 
 |  | 
 |     def parse(self, inputstring=''): | 
 |         """Helper method: parses a string""" | 
 |         return self.parse_args(inputstring.split()) | 
 |  | 
 |     def parse_args(self, args=None): | 
 |         """Helper method: parses a list""" | 
 |         if args is None: | 
 |             self.args = self.parser.parse_args()  # default is sys.argv[1:] | 
 |         else: | 
 |             self.args = self.parser.parse_args(args) | 
 |         return self.args | 
 |  | 
 |     def write_qsub_script(self, filename, echo=False): | 
 |         """ | 
 |         Writes the entire command line to a qsub script | 
 |  | 
 |         filename: name of file to write | 
 |         echo    : echo contents of script to stdout. Default: False | 
 |         """ | 
 |  | 
 |         buf = ['#!/usr/bin/env qsub', '# Written using SGE module'] | 
 |  | 
 |         for option, value in self.args.__dict__.items(): | 
 |             if value is True: | 
 |                 value = '' | 
 |  | 
 |             if option not in ['command', 'command_args', 'xterm_args']: | 
 |                 if isinstance(value, list): | 
 |                     val = ' '.join(value) | 
 |                 else: | 
 |                     val = str(value) | 
 |  | 
 |                 buf.append(' '.join(['#', '-' + option, val])) | 
 |  | 
 |         args = getattr(self.args, 'command_args', []) | 
 |         args = getattr(self.args, 'xterm_args', args) | 
 |  | 
 |         buf.append(' '.join([self.args.command] + args)) | 
 |  | 
 |         if echo: | 
 |             print('\n'.join(buf)) | 
 |  | 
 |         f = open(filename, 'w') | 
 |         f.write('\n'.join(buf)) | 
 |         f.close() | 
 |  | 
 |     def execute(self, mode='local', path=''): | 
 |         """ | 
 |         Executes qsub | 
 |  | 
 |         known modes: local - run locally | 
 |                      echo  - echoes out execution string only | 
 |  | 
 |         path: path to qsub/... executable: Default = nothing | 
 |         """ | 
 |  | 
 |         # Form execution string | 
 |  | 
 |         import random | 
 |         test_id = '' | 
 |         if "build.log" in self.args.o: | 
 |             test_id = self.args.o.split("/")[-2] | 
 |         elif "run.log" in self.args.o: | 
 |             test_id = self.args.o.split("/")[-3] | 
 |         if test_id == '': | 
 |             test_id = str(random.randint(1, 9999)) | 
 |  | 
 |         import os | 
 |         program = os.path.join(path, self.prog) | 
 |         options = [] | 
 |  | 
 |         for option, value in self.args.__dict__.items(): | 
 |             if value is True: | 
 |                 value = '' | 
 |  | 
 |             if isinstance(value, list): | 
 |                 val = ' '.join(value) | 
 |             else: | 
 |                 val = str(value) | 
 |  | 
 |             if option not in ['command', 'command_args', 'xterm_args']: | 
 |                 options.append('-' + option + ' ' + val) | 
 |  | 
 |         args = getattr(self.args, 'command_args', []) | 
 |         args = getattr(self.args, 'xterm_args', args) | 
 |         # ---------------- command file ------------- | 
 |         cwd = os.getcwd() | 
 |         command_file = cwd + '/command_file_' + str(os.getpid()) + '_' + test_id | 
 |         try: | 
 |             with open(command_file, 'w') as f_command: | 
 |                 command_temp = str(self.args.command) | 
 |                 command_temp = command_temp.replace('"', '') | 
 |                 f_command.write(command_temp + "\n/bin/rm -f " + command_file) | 
 |         except IOError: | 
 |             error_msg = 'Error: problem with open File: ' + str(f_command) | 
 |             raise IOError(error_msg) | 
 |  | 
 |         os.chmod(command_file, 0o0777) | 
 |         exestring = ' '.join([program] + options + [command_file] + args) | 
 |         exestring = exestring.replace('-pe lammpi 1', '') | 
 |         exestring = exestring.replace('-slot', '-pe make') | 
 |         exestring = exestring.replace('-ll ', '-l ') | 
 |         exestring = exestring.replace('-t 0', '') | 
 |         #        exestring = exestring.replace('-j y','') | 
 |         print('INFO: sge command file = ' + command_file) | 
 |         if mode == 'echo': | 
 |             return (exestring) | 
 |         elif mode == 'local': | 
 |             import subprocess | 
 |             p = subprocess.Popen(command_file, | 
 |                                  stdout=subprocess.PIPE, | 
 |                                  stderr=subprocess.STDOUT, | 
 |                                  shell=True) | 
 |             print(p.stdout.read()) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     print('Attempting to validate qsub arguments using argparse') | 
 |     o = qsubOptions() | 
 |     o.parse_args() | 
 |     o.args.t = '1-1000' | 
 |     print('I will now print the script') | 
 |     o.write_qsub_script('/dev/null', echo=True) | 
 |     print('*' * 70) | 
 |     print('I will now print the command line') | 
 |     o.execute(mode='echo') |