o .&aj@sddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z e eZGdddeZGdddeZGd d d e ZdS) N)TransferManager)BaseSubscriber)collections_abcc@seZdZddZdZdS)NoSuchBucketErrorcKs(|jjdi|}t||||_dS)N)fmtformat Exception__init__kwargs)selfr msgrrB/usr/lib/python3/dist-packages/awscli/customizations/s3uploader.pyr s  zNoSuchBucketError.__init__zaS3 Bucket does not exist. Execute the command to create a new bucket aws s3 mb s3://{bucket_name}N)__name__ __module__ __qualname__r rrrrrrsrc@speZdZdZeddZejddZ    dddZd d Zdd d Z d dZ ddZ ddZ dddZ dS) S3Uploaderz Class to upload objects to S3 bucket that use versioning. If bucket does not already use versioning, this class will turn on versioning. cCs|jS)zO Metadata to attach to the object(s) uploaded by the uploader. )_artifact_metadata)r rrrartifact_metadata1szS3Uploader.artifact_metadatacCs&|durt|tjstd||_dS)Nz(Artifact metadata should be in dict type) isinstancerMapping TypeErrorr)r valrrrr8s NFcCsB||_||_|p d|_||_||_||_|st|j|_d|_dSN) bucket_nameprefix kms_key_id force_uploads3transfer_managerrr)r s3_clientrrrrrrrrr >s   zS3Uploader.__init__c Cs|jrt|jdkrd|j|}|js&||r&td|||Sz3ddi}|jr7d|d<|j|d<|j r?|j |d<t ||}|j ||j |||g}|||WStjjyz}z|jd d }|d krtt|j d |d }~ww)z Uploads given file to S3 :param file_name: Path to the file that will be uploaded :param remote_path: be uploaded :return: VersionId of the latest upload rz{0}/{1}z:File with same data already exists at {0}. Skipping uploadServerSideEncryptionAES256zaws:kms SSEKMSKeyIdMetadataErrorCode NoSuchBucket)rN)rlenrr file_existsLOGdebugmake_urlrrProgressPercentageruploadrresultbotocore exceptions ClientErrorresponser)r file_name remote_pathadditional_argsprint_progress_callbackfutureex error_coderrrr.Ps@     zS3Uploader.uploadcCs*||}|}|r|d|}|||S)z Makes and returns name of the S3 object based on the file's MD5 sum :param file_name: file to upload :param extension: String of file extension to append to the object :return: S3 URL of the uploaded object .) file_checksumr.)r r4 extensionfilemd5r5rrrupload_with_dedups   zS3Uploader.upload_with_dedupcCs2z |jj|j|dWdStjjyYdSw)z Check if the file we are trying to upload already exists in S3 :param remote_path: :return: True, if file exists. False, otherwise )BucketKeyTF)r head_objectrr0r1r2)r r5rrrr)szS3Uploader.file_existscCsd|j|S)Nz s3://{0}/{1})rr)r obj_pathrrrr,szS3Uploader.make_urlcCst|d;}t}d}|}|d||}t|dkr0||||}t|dks |||WdS1sCwYdS)Nrbir) openhashlibmd5tellseekreadr(update hexdigest)r r4 file_handlerG block_sizecurposbufrrrr<s       $zS3Uploader.file_checksumcCs.|jjj}d||j|}|rd||}|S)z This link describes the format of Path Style URLs http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro z {0}/{1}/{2}z{0}?versionId={1})rmeta endpoint_urlrr)r keyversionbaser/rrrto_path_style_s3_urls  zS3Uploader.to_path_style_s3_url)NNFNr)rrr__doc__propertyrsetterr r.r?r)r,r<rVrrrrr+s"    1rc@seZdZddZddZdS)r-cCs2||_||_ttj||_d|_t |_ dS)Nr) _filename _remote_pathfloatospathgetsize_size _seen_so_far threadingLock_lock)r filenamer5rrrr s zProgressPercentage.__init__cKsr|j,|j|7_|j|jd}tjd|j|j|j|ftjWddS1s2wYdS)Ndz# Uploading to %s %s / %s (%.2f%%))rdrar`sysstdoutwriter[flush)r r8bytes_transferredr percentagerrr on_progresss "zProgressPercentage.on_progressN)rrrr rmrrrrr-s r-)rFloggingrbr]rgr0botocore.exceptionss3transfer.managerrs3transfer.subscribersr awscli.compatr getLoggerrr*r robjectrr-rrrrs      $