o
    ^                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlmZmZ deevrSd	d
 Zee_G dd deZdS )z0Define the test module for an influxdb instance.    )absolute_import)division)print_function)unicode_literalsN)is_port_openget_free_portscheck_outputc                  O   sh   d|v rt dtj| dtji|}| \}}| }|r2|d}|du r,| d }t|||S )zCheck for output.stdoutz3stdout argument not allowed, it will be overridden.argsNr   )
ValueError
subprocessPopenPIPEZcommunicatepollgetCalledProcessError)Z	popenargskwargsZprocessoutputZ
unused_errZretcodecmd r   O/usr/lib/python3/dist-packages/influxdb/tests/server_tests/influxdb_instance.pyf   s"   
r   c                   @   s<   e Zd ZdZdddZdd Zdd Zd	d
 ZdddZdS )InfluxDbInstancezDefine an instance of InfluxDB.

    A class to launch of fresh influxdb server instance
    in a temporary place, using a config file template.
    Fc              
   C   sz   t jdddkrtd|  | _d}	 z	| || W dS  ty; } z|d7 }|dkr1|W Y d}~nd}~ww q)	z+Initialize an instance of InfluxDbInstance.Z!INFLUXDB_PYTHON_SKIP_SERVER_TESTSNTruez8Skipping server test (INFLUXDB_PYTHON_SKIP_SERVER_TESTS)r   T      )	osenvironr   unittestSkipTestfind_influxd_pathinfluxd_path_start_serverRuntimeError)selfconf_templateudp_enablederrorser   r   r   __init__2   s$   
zInfluxDbInstance.__init__c              
   C   sR  t  | _t j| jd }| _td}i }dD ]
}| ||d < q|s(d|d< ttj	|dtj	|dtj	|d	tj	|d
tj	|dtj	| jd|rRdndd}|
| | j
| tj	| jd}t|d)}	t|}
|	|
 jdi | W d    n1 sw   Y  W d    n1 sw   Y  tj| jd|gtjtjd| _tdtj | j| j| jf  t d }z@t |k rt| jrt| jr|rtd W d S td | j d urtdt |k s| j  | j   td|  ty( } z| ! }t"||d< tj |d< td| d }~ww )N)dir   )ZhttpglobalmetaZudpZ_portZudp_portr-   dataZwalstateZhandoffzlogs.txttrueZfalse)Zmeta_dirZdata_dirZwal_dirZcluster_dirZhandoff_dir	logs_filer&   zinfluxdb.confwz-config)r	   stderrz6%s > Started influxdb bin in %r with ports %s and %s..
   g      ?zinfluxdb prematurely exitedz8Timeout waiting for influxdb to listen on its ports (%s)reasonnowzK%(now)s > %(reason)s. RC=%(rc)s
stdout=%(out)s
stderr=%(err)s
logs=%(logs)rr   )#tempfileZmkdtemptemp_dir_baseZtemp_dir_influxdbr   popdictr   pathjoinupdate__dict__openwritereadformatr   r   r!   r   procprintdatetimer7   Zglobal_portZ	http_porttimer   sleepr   r#   	terminatewaitget_logs_and_outputstr)r$   r%   r&   ZtempdirZ
free_portsZportsserviceZ	conf_dataZ	conf_filefhZfh_templateZtimeouterrr/   r   r   r   r"   F   s   


	






zInfluxDbInstance._start_serverc                 C   s   t jdd}|du r+tjd}|s+ztddg }W n tj	y*   d}Y nw t j
|s6tdt|dg}td| tjd	 |S )
zFind the path for InfluxDB.ZINFLUXDB_PYTHON_INFLUXD_PATHNZinfluxdwhichz/opt/influxdb/influxdzCould not find influxd binaryversionzInfluxDB version: %s)file)r   r   r   	distutilsZspawnZfind_executabler   r   stripr   r<   isfiler   r   rE   sysr4   )r$   Zinfluxdb_bin_pathrQ   r   r   r   r       s*   
z"InfluxDbInstance.find_influxd_pathc              
   C   s   | j }zt| j}| }W d   n1 sw   Y  W n ty4 } z
d| }W Y d}~nd}~ww |j|j |j |dS )zQuery for logs and output.NzCouldn't read logs: %s)ZrcoutrO   logs)rD   r@   r2   rB   IOError
returncoder	   r4   )r$   rD   rN   rX   rO   r   r   r   rK      s   
z$InfluxDbInstance.get_logs_and_outputTc                 C   s,   | j   | j   |rt| j dS dS )zClose an instance of InfluxDB.N)rD   rI   rJ   shutilrmtreer9   )r$   Zremove_treer   r   r   close   s
   

zInfluxDbInstance.closeN)F)T)	__name__
__module____qualname____doc__r)   r"   r    rK   r]   r   r   r   r   r   +   s    
Rr   )ra   Z
__future__r   r   r   r   rF   Zdistutils.spawnrS   r   r8   r[   r   rV   rG   r   Zinfluxdb.tests.miscr   r   r*   r   r   objectr   r   r   r   r   <module>   s&   