3
dc                 @   s^   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ejd	ZG d
d de	ZdS )z+Parallel workflow execution via PBS/Torque
    N)sleep   )logging)CommandLine   )SGELikeBatchManagerBaseloggerznipype.interfacec                   s4   e Zd ZdZdZ fddZdd Zdd Z  ZS )		PBSPluginay  Execute using PBS/Torque

    The plugin_args input to run can be used to control the SGE execution.
    Currently supported options are:

    - template : template to use for batch job submission
    - qsub_args : arguments to be prepended to the job execution script in the
                  qsub call
    - max_jobname_len: maximum length of the job name.  Default 15.

       c                s   d}d| _ d| _d| _d|krt|d rtd|d kr@|d d | _ d|d krZ|d d | _d|d krt|d d | _tt| j|f| d S )Nz
#PBS -V
           r
   plugin_argsZretry_timeoutZ	max_triesZmax_jobname_len)_retry_timeout
_max_triesZ_max_jobname_length_max_jobname_lensuperr	   __init__)selfkwargstemplate)	__class__ =/tmp/pip-build-7vycvbft/nipype/nipype/pipeline/plugins/pbs.pyr      s    zPBSPlugin.__init__c             C   sZ   t dj|ttjddddj }|jj}|jj}d}d}||ksJd|krNdS ||kS d S )	Nzqstat -f {}Z
file_splitFT)environterminal_outputresource_monitorZignore_exceptionzUnknown Job IdzJob has finishedzjob_state = C)	r   formatdictosr   runruntimestdoutstderr)r   taskidresultr    r!   errmsgsuccessr   r   r   _is_pending.   s    zPBSPlugin._is_pendingc             C   s  t dttjddd}tjj|}d}| jr2| j}d|jkrnd|jkr\|jd r\|jd }n|d|jd  7 }d	|krd
||f }d|krd||f }|jrdj	ttjd |j|j
f}ndj	ttjd |j
f}|jd}|j  dj	|}|d| j }d|||f |j_tj}tjtjd d}	xvy|j }
W n` tk
r } zB|	| jk rn|	d7 }	t| j ntj| tdj|j
|W Y d d }~X nX P q.W tj| |
jjjdd }|j | j|< t j!dj||j
 |S )NZqsubFZ	allatonce)r   r   r    Z	qsub_args	overwrite z-oz%s -o %sz-ez%s -e %s.LOGNAMEr   z%s -N %s %sCRITICALr   z(Could not submit pbs task for node {}
{}z"submitted pbs task: {} for node {})"r   r   r   r   pathdirnameZ
_qsub_argsr   Z
_hierarchyjoin_idsplitreverser   inputsargsifloggerlevelsetLevelr   getLevelNamer   	Exceptionr   r   r   RuntimeErrorr   r   r    
output_dirZ_pendingr   debug)r   Z
scriptfilenodecmdr-   ZqsubargsZjobnameZjobnameitemsZoldleveltriesr#   er"   r   r   r   _submit_batchtask@   sX    
 


"
zPBSPlugin._submit_batchtask)	__name__
__module____qualname____doc__r   r   r&   rA   __classcell__r   r   )r   r   r	      s
   r	   )rE   r   timer   r'   r   Zinterfaces.baser   baser   r   	getLoggerr5   r	   r   r   r   r   <module>   s   
