U
    b                     @   s   d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
 ddlmZ edZdd	 Zedk	r|e eZdS )
    N)Path)Config)ProcessStarter   )find_executableminioc                 #   sv   G fddd}t d |  G  fdddt}|  j|\}}t d| d|   V  |  j  dS )	a@  
    Mock a local S3 server using `minio`

    This requires:
    - pytest-xprocess: runs the background process
    - minio: the executable must be in PATH

    Note, the given S3 server will be EMPTY! The test function needs
    to populate it. You can use
    `conda.testing.helpers.populate_s3_server` for that.
    c                       s4   e Zd ZdZdZ fddZedd Zdd Zd	S )
zminio_s3_server.<locals>.Miniominio_s3_serveri(#  c                    s   t  | j   d S )N)r   namemkdirselftmp_path >lib/python3.8/site-packages/conda/testing/gateways/fixtures.py__init__'   s    z'minio_s3_server.<locals>.Minio.__init__c                 S   s   d| j  d| j S )Nzhttp://localhost:/)portr	   r   r   r   r   
server_url*   s    z)minio_s3_server.<locals>.Minio.server_urlc              
   S   s   t j }|jd|ddtdddd}tddd	d
dgd| ddgd}|j||d t	|D ]F\}}}	|	D ]6}
t
||
}||}|jt||t|ddid qtqfdS )z0prepare the s3 connection for our minio instanceZs3Z
minioadminZs3v4)Zsignature_versionz	us-east-1)Zendpoint_urlZaws_access_key_idZaws_secret_access_keyZconfigZregion_namez
2012-10-17ZAddPermZAllow*zs3:GetObjectzarn:aws:s3:::z/*)ZSidZEffectZ	PrincipalZActionZResource)ZVersionZ	Statement)ZBucketZPolicyZACLzpublic-read)Z	ExtraArgsN)boto3sessionZSessionclientr   jsondumpsZput_bucket_policyoswalkr   relative_toZupload_filestr)r   ZendpointZbucket_nameZchannel_dirr   r   Zbucket_policyZcurrent_filesfpathkeyr   r   r   populate_bucket.   s>    



z.minio_s3_server.<locals>.Minio.populate_bucketN)	__name__
__module____qualname__r	   r   r   propertyr   r$   r   r   r   r   Minio!   s   
r)   zStarting mock_s3_serverc                       s:   e Zd ZdZdZdZedd j gZ jfddZ	dS )	z minio_s3_server.<locals>.Starterzhttps://docs.min.ioT
   Zserverz--address=:c              
   S   sr   t   }d}d}zPz|||f W n8 tk
r\ } ztd|||f  d}W 5 d }~X Y nX W 5 |  X | S )NZ	localhostFz-something's wrong with %s:%d. Exception is %sT)socketcloseZconnect	Exceptionprint)r   r   sZaddresserrorer   r   r   startup_checkh   s    
z.minio_s3_server.<locals>.Starter.startup_checkN)
r%   r&   r'   patternZterminate_on_interruptZtimeout	MINIO_EXEr   argsr2   r   r   r   r   r   Starter\   s   
r7   zServer (PID: z) log file can be found here: N)r.   r   Zensurer	   ZgetinfoZ	terminate)xprocessr   r)   r7   pidZlogfiler   r6   r   r      s    8r   )r   r   r+   pathlibr   Zpytestr   Zbotocore.clientr   r8   r   Zcli.find_commandsr   r4   r   Zfixturer   r   r   r   <module>   s   i