U
    d
                     @   sr   d Z ddlmZ ddlmZ ddlmZ zddlZddlZW n e	k
rX   dZdZY nX dZ
G dd	 d	eZdS )
zs3 result store backend.    )bytes_to_str)ImproperlyConfigured   )KeyValueStoreBackendN)	S3Backendc                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )r   a0  An S3 task result store.

    Raises:
        celery.exceptions.ImproperlyConfigured:
            if module :pypi:`boto3` is not available,
            if the :setting:`aws_access_key_id` or
            setting:`aws_secret_access_key` are not set,
            or it the :setting:`bucket` is not set.
    c                    s   t  jf | trtstd| jj}|dd | _|dd | _	|dd | _
|dd | _|dd | _| jsztd|dd | _|  | _d S )	Nz'You must install boto3to use s3 backendZs3_endpoint_urlZ	s3_regionZs3_access_key_idZs3_secret_access_keyZ	s3_bucketzMissing bucket nameZs3_base_path)super__init__boto3botocorer   Zappconfgetendpoint_url
aws_regionaws_access_key_idaws_secret_access_keybucket_name	base_path_connect_to_s3_s3_resource)selfkwargsr   	__class__ 6/tmp/pip-unpacked-wheel-mu1yl971/celery/backends/s3.pyr      s    zS3Backend.__init__c                 C   s$   | j r| j | n|}| j| j|S N)r   r   ZObjectr   )r   keyZkey_bucket_pathr   r   r   _get_s3_object5   s    zS3Backend._get_s3_objectc              
   C   s   t |}| |}z2|  | d  }| jdkr:|n|dW S  tjj	k
r } z$|j
d d dkrvW Y d S |W 5 d }~X Y nX d S )NBodybinaryzutf-8ErrorZCodeZ404)r   r   loadr   readcontent_encodingdecoder
   
exceptionsZClientErrorresponse)r   r   	s3_objectdataerrorr   r   r   r   9   s    

zS3Backend.getc                 C   s"   t |}| |}|j|d d S )N)r   )r   r   put)r   r   valuer'   r   r   r   setE   s    
zS3Backend.setc                 C   s   t |}| |}|  d S r   )r   r   delete)r   r   r'   r   r   r   r-   J   s    
zS3Backend.deletec                 C   s:   t j| j| j| jd}| d kr*td|jd| jdS )N)r   r   Zregion_namezMissing aws s3 credsZs3)r   )	r	   Sessionr   r   r   Zget_credentialsr   resourcer   )r   sessionr   r   r   r   O   s    zS3Backend._connect_to_s3)__name__
__module____qualname____doc__r   r   r   r,   r-   r   __classcell__r   r   r   r   r      s   
r   )r4   Zkombu.utils.encodingr   Zcelery.exceptionsr   baser   r	   r
   ImportError__all__r   r   r   r   r   <module>   s   
