Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
a

]‰rg‘¼ã@s’dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZdZ
dZdZdZe e¡Zd	d
„ZGdd„deƒZdS)
z Trilio S3 Backend implimentation

    This module contains the back end implimentation of all of all S3 specific
    support.
éN)ÚClientError)Úget_retention_modeÚs3ièz$80bc80ff-0c51-4534-86a2-ec5e719643c2iôcCs&|jdd}|t ddd¡ ¡}|S)zè Utility function used to convert a datetime to an OS timestamp.

    Args:
        modified_time (datetime): Datatime object to convert to a Unix Epoc timestamp.

    Returns:
        The value of modified_time as a timestamp.
    N)Ztzinfoi²é)ÚreplaceÚdatetimeZ
total_seconds)Z
modified_timeZ
naive_timeZ
delta_seconds©rú2/usr/lib/python3.9/site-packages/s3fuse/vaults3.pyÚ_make_timestamp#s	ÿr
c@söeZdZdZdd„Zdd„Zdd„Zdd	„Zd
d„Zdd
„Z	dd„Z
d<dd„Zdd„Zdd„Z
dd„Zdd„Zdd„Zd=dd „Zd!d"„Zd>d#d$„Zd?d%d&„Zd@d'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„ZdAd4d5„ZdBd6d7„Zd8d9„Zd:d;„ZdS)CÚ	S3Backendz´ S3 Backend implimentation.

    A Wrapper for the AWS S3 boto3 and botocore API. This class encapsulates all S3
    operations and exposes them as a backend storage instance.
    c
Csdd}d}||_| d¡r&t| d¡ƒnt}|ddkrVtjj|dt|dƒ|d}ntjjt|dƒ|d}|ds²tjd|d	d
|d|d|d	d
||d|dd}n||ddkrútjd|d	d
|d|d|d	d
||d|dd}n4tjd|d	d
|d|d|d	d
||dd}dd„}|jj	 
d|¡||_|d|_|d|_
dS)NZvault_s3_max_pool_connectionsZs3_signatureÚdefaultZs3_read_timeout)Zsignature_versionÚread_timeoutÚmax_pool_connections)r
rZ
s3_ssl_verifyrZ
os_optionsÚregion_nameÚuserÚkeyZobject_storage_urlZs3_ssl)rÚaws_access_key_idÚaws_secret_access_keyÚendpoint_urlÚconfigÚuse_sslZverifyZs3_ssl_certÚ)rrrrrrc[sd|jd<dS)Nz
keep-aliveZ
Connection)Úheaders)ZrequestZoperation_nameÚkwargsrrr	Úset_connection_header]sz1S3Backend.__init__.<locals>.set_connection_headerzrequest-created.s3ÚbucketÚretention_mode)ÚoptionsÚgetÚintÚDEFAULT_MAX_POOL_SIZEÚbotocoreZclientZConfigÚboto3ÚmetaZeventsÚregisterÚ_S3Backend__clientÚ_S3Backend__bucket_nameÚ_S3Backend__retention_mode)ÚselfrZ
config_objectZ	s3_clientZ
MAX_POOL_SIZErrrr	Ú__init__9sXÿÿ
þÿ

û

û

û
zS3Backend.__init__cCs(t|j|d|dƒ|d<|d|_dS)NrÚbucket_object_lockr)rr%r')r(rrrr	Úset_retention_modeeszS3Backend.set_retention_modec
Cs"z|jj|jdz€|jj|jd}|drP| di¡ d¡dkrPtd|ƒ‚|dsz| di¡ d¡dkrztd|ƒ‚|dr’|ds’td	ƒ‚Wn.tyÂ}z|dr®‚WYd
}~n
d
}~00|dstj ddd
dddd¡}|jj	|j|dd|jj
|j|dWn‚Yn0d
S)af Validates the S3 credentials / permission on the provided bucket.
            It also validates against s3 object lock configuration and if the s3 supports
            more than 255 object name length
        Args:
            self : S3 Backend object
        Returns:
            Does not return anything, But raises exception if validation fails.
        )ÚBucketr*ZObjectLockConfigurationZObjectLockEnabledZEnabledzZConfigration says object lock enabled on the bucket, but s3 API does not agree with it. %sz[Configration says object lock disabled on the bucket, but s3 API does not agree with it. %sÚuse_manifest_suffixzR'use_manifest_suffix' must be set to True when 'bucket_object_lock' is set to TrueNztvault_config/z.workload_f5190be6-7f80-4856-8c24-149cb40500c5/z.snapshot_f2e5c6a7-3c21-4b7f-969c-915bb408c64f/z+vm_id_e81d1ac8-b49a-4ccf-9d92-5f1ef358f1be/z3vm_res_id_72477d99-c475-4a5d-90ae-2560f5f3b319_vda/z.deac2b8a-dca9-4415-adc1-f3c6598204ed-segments/z0000000000000000.00000000z	Test Data)r,ÚKeyÚBody©r,r.)r%Zhead_bucketr&Zget_object_lock_configurationrÚ	ExceptionÚosÚpathÚjoinÚ
put_objectÚ
delete_object)r(rZobj_lock_cfgÚexZlong_keyrrr	Úvalidate_s3_clientjsL	ÿÿÿÿ
ùÿzS3Backend.validate_s3_clientcCs¾z¤t|ƒdkr¢g}|dt…}|D](}| d¡r<|dd…}| d|i¡q"z|jj|jd|idWn,|D]}|jj|j|ddqrYn0|td…}qWnty¸‚Yn0dS)	zß Utility method that takes a list of objects and puts it in the correct format
            for the S3 delete_objects() API.

        Args:
            object_list (list): A list of objects with the correct S3 path.
        rNú/rr.ÚObjects©r,ZDeleter0)	ÚlenÚMAX_S3_PAGE_SIZEÚ
startswithÚappendr%Údelete_objectsr&r6r)r(Úobject_listZobject_delete_listZ	list_partÚobjrrr	Z__delete_object_listœs(

ÿ

ÿzS3Backend.__delete_object_listcCsŽztg}|j d¡}|j|j|d}|D]@}d|vr&| dt|dƒ¡dkr&|dD]}| |d¡qRq&| |¡Wntyˆ‚Yn0dS)z‘ Utility method used to perform a rmdir operation on an object hierarchy

        Args:
            object_tree (str): Object/Tree path.
        Úlist_objects©r,ÚPrefixÚContentsÚKeyCountrr.N)	r%Ú
get_paginatorÚpaginater&rr<r?Ú_S3Backend__delete_object_listr)r(Úobject_treerAÚlist_paginatorÚ
page_iteratorÚobjectsrBrrr	Z__delete_object_treeºsÿ zS3Backend.__delete_object_treecCs| |¡dS)zó Delete a list of objects.

        Args:
            object_list (list): List of objects. Each with a full object path
                                in correct format.
            options (dic): Dictionary of configuration options.
        N)rJ)r(rArrrr	Údelete_object_listÐszS3Backend.delete_object_listcCs¬z’|sWdSd |¡}| d¡r,|dd…}d|vrH|jj|j|dnH| d¡d}|j|dd}|rzt|dd	d
}n|}|jj|j|dWnty¦‚Yn0dS)a Delete an object from the S3 object store.

        The object and any segments stored in the segment directory will be
        removed.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.
        Nr9rú	-segmentsr0ú	.manifestT©Ústrict_path_filter©Úreverser)	r4r>r%r6r&ÚstriprCÚsortedr)r(ÚargsrÚobject_nameÚmanifest_prefixÚ	manifestsÚ
manifest_namerrr	r6Ús(



ÿ
ÿ
zS3Backend.delete_objectrcCs°td|ƒ}zŒtd|ƒD]|}z|jj|j|dWWdSty}zB|jdddkrz|d|krzt d¡WYd}~q‚WYd}~qd}~00qWntyª‚Yn0dS)a Utility method used to wait for a S3 object to become available.

        This routine will keep performing a head_object() request every second
        for "retries" number of times. This was added to work around any potential
        eventual consistancey issues when uploading to AWS.

        Args:
            object_name (str): Name of the object.
            retries (int): Optional parameter that defaults to 1.

        Returns:
            Returns when the object is available or ClientError not found exception.
        rrr0NÚResponseMetadataÚHTTPStatusCodeé”)	ÚmaxÚranger%Úhead_objectr&rÚresponseÚtimeÚsleep)r(rYÚretriesÚretryÚerrorrrr	Z__wait_for_objectýs"

ÿ

ÿ
zS3Backend.__wait_for_objectc	Cszb| d¡d}|jdr(|jdr<|jj|j|d}n|jj|j|d}|r,|}| dg¡pn| dg¡}|jdr|jj|j|d}| dg¡p¤| dg¡}|rºt|dd	„d
}|D]Z}|jj	|j|d| dd
¡d}|dd dd¡dkr¾t
 |d |d¡¡WSq¾|dd}n|}|s:t
dƒ‚|jj	|j|d}t
 |d |d¡¡WStyþ}z€|jdddkrŽ‚n\zD| |d¡|jj	|j|d}t
 |d |d¡¡WWYd}~Styè‚Yn0WYd}~n
d}~00dS)úÓ Download and return the object manifest as a json array.

            Args:
                object_name (str): Name of the object.

            Returns:
                Object manifest as a dictionary.
        r9rQr-r*rDÚVersionsrFcSs|dS©NÚLastModifiedr©Úkrrr	Ú<lambda>8óz/S3Backend.get_object_manifest.<locals>.<lambda>©rr.Ú	VersionIdr©r,r.rrr]ÚHTTPHeadersú$x-amz-meta-stamp-trilio-authenticityÚFalseÚTruer/Ú
ContentLengthéÿÿÿÿzOManifest object with 'x-amz-meta-stamp-trilio-authenticity' attribute not foundr0r^r_é
N)rVrr%Zlist_objects_v2r&rCrÚlist_object_versionsrWÚ
get_objectÚjsonÚloadsÚreadr1rrcÚ_S3Backend__wait_for_object)	r(rYrZr[r\Úmanifests_dataÚmanifestÚresprhrrr	Úget_object_manifestsd	
þþ

þÿÿ ÿ
ÿ&zS3Backend.get_object_manifestcCsÈ| d¡d}|jdrdS|jj|j|d}|r¸| dg¡pH| dg¡}g}|D]}| d|di¡qR|rÄz|jj|jd	|id
WqÄ|D]}|jj|j|ddq”YqÄ0nt	d|ƒ‚dS)
rir9rQr*NrDrjrFr.r:r;r0zManifest for %s is not found)
rVrr%rCr&rr?r@r6r1)r(rYrZrƒr[Úobjs_to_deleteÚmanrBrrr	Údelete_object_manifestXs.

þ
ÿ

ÿz S3Backend.delete_object_manifestcCsdz8d |¡}i}|jr d|ji}|j |j||j|¡Wn&tyL‚Ynty^‚Yn0dS)a? Download a file from the S3 object store.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.

        Returns:
            On success, the contents of the object are downloaded to file identidfied
            by options.out_file.
        r9rrN)r4Ú
version_idr%Z
download_filer&Zout_filerr1)r(rXrrYÚ
extra_argsrrr	Údownload_objectzs

ÿzS3Backend.download_objectcCstzHd |¡}|jr*|jj|j||jd}n|jj|j|d}|d ¡WSty\‚Yntyn‚Yn0dS)aB Get object from the S3 object store in buffer.
        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.
        Returns:
            On success, the contents of the object are downloaded to file identidfied
            by options.out_file.
        r9rsr0r/N)r4rˆr%r|r&rrr1)r(rXrrYrcrrr	r|’s"	
ýþzS3Backend.get_objectcCs„zj|jdur0| tj |dd|d¡|¡|jdurh|jj|j|dd|d||dd}|WSWnt	y~‚Yn0dS)a Put an object to the S3 object store.
        Args:
            args (list): List of object name parts.
            buf: Data to upload in object.
            buf_len: Length of data to upload in object.
            options (dic): Dictionary of configuration options.
        Frr9rYNúapplication/octet-stream)r,r.rxr/ÚContentType)
Ú
path_validÚ_S3Backend__create_folderr2r3ÚdirnamerYr%r5r&r)r(rXÚbufZbuf_lenrrƒrrr	r5¬s
ÿ

ü
zS3Backend.put_objectNFcCs^tƒ}| d¡}z0t}|dur,|tkr,|}|jdrD|j d¡}n|j d¡}|j|j|dd|id}|D]Ê}d|vr| d	t	|dƒ¡d
kr|dD]f}	|durÈt	|ƒ|krÈt
|ƒWS|	d d¡}
|ræ| |
¡qžd|
vrž| |
 
dd
¡d
¡qžd|vr¤| d	t	|dƒ¡d
kr¤|dD]p}	|dur`t	|ƒ|kr`t
|ƒWS|	d d¡}
|r€| |
¡n d|
vr2| |
 
dd
¡d
¡q2d|vrl|dD]‚}|durât	|ƒ|krât
|ƒWS| t¡sþ|d t¡s´| d¡r | |d d¡¡n| |d d¡¡q´qlt
|ƒWStyX‚Yn0dS)ae Return a list of objects based on the provided prefix.

        Used to generate a directory listing based on a prefix path
        constructed from the object parts in prefix

        Args:
            prefix (string): prefix of the object path. If the prefix is terminated 
                by "/", then it lists the contents in the "subdir". If the prefix
                is not terminated by "/", then it lists the contents in the current
                directory that matches the prefix
                Ex:
                    case 1:
                    =======
                    prefix - /a/b/c
                    object store has objects - /a/b/c, /a/b/c1, /a/b/d
                    return values - /a/b/c and /a/b/c1

                    case 2:
                    =======
                    prefix - /a/b/c/
                    object store has objects - /a/b/c/d, /a/b/c1, /a/b/c/e
                    return values - /a/b/c/d and /a/b/c/e
            options (dic): Dictionary of configuration options
            max_items (int): Maximum number of objects in a list query. Default is
                unlimited but when testing for an empty directory a smaller
                number can be used to limit the query and size of the list that
                is returned.
            strict_path_filter (bool): Defaults to True in order to only return
                objects with the exact same prefix. Individual segment listings
                set this to False in order to get a match on the segment offset.

        Returns:
            On success a list of unique items to be used as a directory listing.
        r9Nr*r{rCZPageSize)r,rEÚ	DelimiterZPaginationConfigrFrGrr.rQrrjÚCommonPrefixesrE)ÚsetÚlstripr=rr%rHrIr&rr<ÚlistÚrstripÚaddÚsplitr>Ú_SEGMENT_PREFIXÚendswithrVr)r(ÚprefixZ	max_itemsrSZ
object_setZ	page_sizerLrMrNÚitemrYZ
object_prefixrrr	rCÈs\#

ý
$$
ÿ
zS3Backend.list_objectscCsHz.g}tj d |¡|j¡}|j|dd}|WStyB‚Yn0dS)a& Returns a list of object segments based on a prefix.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.

        Returns:
            A list of segments in the object store that match the supplied prefix.
        r9TrRN)r2r3r4r›rCr)r(rXrZsegment_listZ
segments_pathrArrr	Ú
list_segments,s
ÿzS3Backend.list_segmentscCsZg}|j d¡}|j||dD]}d|vr| |d¡qt|dd„dd}dd	„|DƒS)
a+
        List all object versions in a bucket sorted from latest to oldest.

        :param bucket_name: Name of the S3 bucket
        :param prefix: (Optional) Filter objects starting with this prefix
        :return: List of object versions sorted by last modified date (latest to oldest)
        r{rDrjcSs|dSrkr)Úvrrr	roRrpz7S3Backend.list_sorted_object_versions.<locals>.<lambda>T©rrUcSs>g|]6}|d|d|d|d| dd¡| dd¡dœ‘qS)	r.rrrlÚIsLatestÚSizerÚETagr)r.rrrlr r¡r¢)r)Ú.0Úversionrrr	Ú
<listcomp>Us	ù

úz9S3Backend.list_sorted_object_versions.<locals>.<listcomp>)r%rHrIÚextendrW)r(Úbucket_namer›ZversionsZ	paginatorZpageZsorted_versionsrrr	Úlist_sorted_object_versionsAs	÷z%S3Backend.list_sorted_object_versionscCs| ||¡S)N)Ú_S3Backend__get_object_headers)r(rYrfrrr	Úget_object_headersaszS3Backend.get_object_headerscCsžtd|ƒ}zvtd|ƒD]d}z|jj|j|d}|WWSty|}z$|jdddkrfz@|jj|j|dd}| d¡pˆd	|d<|WWYd
}~WStyd}z¤|jdddkrNd|vr zÒ| d¡d}|j	d
r|j
|j|d}|rÔt|dd„dd}d
}|D]Š}	|jj|j|	d|	 dd¡d}|	d|d<|	 d¡rjt 
|¡}|dd dd¡dkr$|WWYd
}~WYd
}~WSq$|WWYd
}~WYd
}~WS|}
|jj|j|d}||d<|WWYd
}~WYd
}~WS|jj|j|d}| dg¡p@| dg¡}t|dd„d }|rf|d!d}
n|}
|jj|j|
d}|
|d<|WWYd
}~WYd
}~WSWntty}zZ|jdddkr|d|krt d¡WYd
}~WYd
}~WYd
}~q‚WYd
}~n
d
}~00|d|krNt d¡WYd
}~WYd
}~q‚WYd
}~n
d
}~00‚WYd
}~qd
}~00qWnty˜‚Yn0d
S)"a= Utility method that gets an object head from the repository with retry support.

        The default is to try once. Admittedly, this is ugly because the
        provided object name might be a terminal object or a "directory" so
        we need to try both cases for each retry attempt. When retry > 1, there is
        a 1 second delay between attempts.

        Args:
            object_name (str): Name of the object.
            retries (int): Optional parameter, default is 1 attempt.

        Returns:
            Object head dictionary or Boto3 exception.
        rrr0r]r^r_r9rŒúapplication/x-directoryNrPrQr*)r§r›cSs|dSrkrrmrrr	rorpz0S3Backend.__get_object_headers.<locals>.<lambda>TrŸr.rrrrsr rtrurvrwrDrjrFcSs|dSrkrrmrrr	ro§rprqry)r`rar%rbr&rrcrrVrr¨rWÚcopyÚdeepcopyrCrdre)r(rYrfrgÚobj_headersrhrZrZlatest_object_headerr‚r\r[rrr	Z__get_object_headersds®

ÿ
ÿ
ÿ

þ
ÿÿ,$þ$þÿþ(ÿþþ
ý
 
zS3Backend.__get_object_headersc
Csdddddœ}i|d<i|dd<d |¡}zÔ|sLttj ¡ƒ|d<|WSz| |¡}Wnˆtyâ}zp|jj|jd|d	}d
|vrÌ|ddd„|d
DƒvrÈtj 	|d
ddd¡}d|idœ}q΂n‚WYd}~n
d}~00t|dƒ|d<||d<| 
dd¡dks|ddkr$d|d<|dd ¡D]D\}	}
d|	 ¡vrf|
|d|	 ¡ 
d¡d<n|
|d|	 ¡<q4t|dd 
dd¡ƒdkr²|dd 
dd¡|d<n<t|d 
dd¡ƒdkrâ|d 
d d¡|d<n|d|d<|d|d!<|WSWnty‚Yn0dS)"a) Get "operating system like" stat data for the given object.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.

        Returns:
            A stat structure containing object information required by caller.
        rrF)Ú	timestampÚsizeÚetagÚ	directoryrÚMetadatar9r¯)r,r‘rEr’cSsg|]}|d‘qS)rEr)r£Úxrrr	r¥Þrpz)S3Backend.stat_object.<locals>.<listcomp>r]rtÚdatez%a, %d %b %Y %H:%M:%S %Z)rxrlr³NrlrŒú
text/plainr«rxTr²zx-object-meta-rzx-object-meta-segment-countzx-object-meta-total-sizer°z
segment-countz
total-sizezx-account-bytes-used)r4r
rZnowr©Ú
BaseExceptionr%rCr&ÚstrptimerÚitemsÚlowerr˜rr)r(rXrZ	stat_datarYZ
obj_headerr7rNZmdrÚvaluerrr	Ústat_objectÂs‚

ÿýÿþÿ
ÿ
þÿÿÿÿÿÿ
ÿ

zS3Backend.stat_objectcCsd |¡}| ||¡dS)zÎ Create an object that represents a directory in the object store.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.
        r9N)r4rŽ)r(rXrZ
new_folderrrr	Úmkdir_objects
zS3Backend.mkdir_objectcCs\d |¡d}| d¡r$|dd…}| |¡z|jj|j|dWntyVYn0dS)zÎ Remove an object that represents a directory in the object store.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.
        r9rNr0)r4r>Ú_S3Backend__delete_object_treer%r6r&r·)r(rXrrKrrr	Úrmdir_objects


ÿ
zS3Backend.rmdir_objectc
CsbzD| d¡d}|jdrv|j|dd}|r`t|ddd d¡d	}t|d
ƒ}d|d}ndd}|d|}n|}|D]"}| d
¡|d<| dd¡|d<q~t |¡}	|j	j
|j|||	dd|jdrD|rDg}
|D]}|
 d|i¡qÞz|j	j
|jd|
idWn6tyB|
D]}|j	j|j|ddq Yn0Wnty\‚Yn0dS)a Upload a new object manifest to the object store.

        Args:
            object_name (str): Name of the object. A ".manifest" will be added.
            put_headers (dic): Dictionary of meta data to be
                               added to the object.
            manifest_data (dic): The manifest data which becomes
                                 the body of file.
        r9rQr-TrRrTrÚ.ryéú%08xrr3Únamer±Úhashr¶)r,r.r³r/rŒr.r:r;r0N)rVrrCrWr˜rÚpopr}Údumpsr%r5r&r?r@r·r6r)
r(rYZput_headersZ
manifest_datarZr[Úsuffixr\Zsegment_datar‚r…r†rBrrr	Úupload_object_manifest*sR

ÿ


üþ

ÿz S3Backend.upload_object_manifestcCs¸zž| d¡d}|jdrp|j|dd}|rZt|ddd d¡d	}t|d
ƒ}d|}ndd}|d|}n|}tj |j	|¡}|j
j|j	|||dd
Wnty²‚Yn0dS)a
 Upload a new object manifest to the object store.

        Args:
            object_name (str): Name of the object. A ".manifest" will be added.
            attributes (dic): The attributes data which becomes
                              the body of file.
        r9rQr-TrRrTrrÀryrÁrÂZREPLACE)r,r.Z
CopySourcer³ZMetadataDirectiveN)
rVrrCrWr˜rr2r3r4r&r%Zcopy_objectr)r(rYZ
attributesrZr[rÇr\Zcopy_srcrrr	Úupdate_object_attributes]s.
ÿ


ü
z"S3Backend.update_object_attributesrcCshzN| d¡}|r0|jj|j|||j|dœdn|jj|j||j|dœdWntyb‚Yn0dS)a€ Upload a new object manifest to the object store.

        Args:
            object_name (str): Name of the object. A ".manifest" will be added.
            put_headers (dic): Dictionary of meta data to be added
                               to the object.
            manifest_data (dic): The manifest data which becomes the
                                  body of file.
        r9©ZModeZRetainUntilDate©r,r.rrÚ	Retention©r,r.rÌN)rVr%Úput_object_retentionr&r'r)r(rYÚretainuntilÚ	versionIdrrr	Úput_object_segment_retention~s*

ÿüÿý
z&S3Backend.put_object_segment_retentionc	CsÚzÀ|sz| d¡d}|jdrt|j|dd}|r^t|ddd d¡d	}t|d
ƒ}d|}ndd}|d|}q~|}n|}|r¢|jj|j|||j	|dœd
n|jj|j||j	|dœdWnt
yÔ‚Yn0dS)aK Upload a new object manifest to the object store.

        Args:
            object_name (str): Name of the object. A ".manifest"
            will be added. put_headers (dic): Dictionary of meta data
            to be added to the object. manifest_data (dic): The manifest
            data which becomes the body of file.
        r9rQr-TrRrTrrÀryrÁrÂrÊrËrÍN)rVrrCrWr˜rr%rÎr&r'r)	r(rYrÏr.rÐrZr[rÇr\rrr	Úput_manifest_retentionžsD	
ÿ

ÿüÿý
z S3Backend.put_manifest_retentioncCs<z|jj|j|dWnty6}z|jdddkr"| d¡}d}|D]Î}|dkrdq"||d}z|jj|j|dWqRty}z~|jdddkrþz|jj|j|ddd	Wn8tyü}z |jddd
krè‚WYd}~n
d}~00WYd}~qRWYd}~qRd}~00qRWYd}~n
d}~00dS)a< Utility method used to create a object directory structure.

        The entire path is split and each directory level is created
        as an object if it does not exist.

        Args:
            folder_name (str): The entire folder name.
            options (dic): Dictionary of configuration options.
        r0r]r^r_r9rzTrilioVault directory objectr«)r,r.r/rŒi™N)r%rbr&rrcr˜r5)r(Zfolder_namerrhÚ
path_partsÚnew_pathÚpartrrr	Z__create_folderÌsP
ÿ
ÿ
ÿþþý
	ÿþþzS3Backend.__create_foldercCsâ|dd…}z¼|jdur<| tj |dd|d¡|¡|jdurÆt|ddƒb}|jj||j	|dd|ddd	id
|jj
|j	|dd|dd}|WdƒWS1s¼0YWntyÜ‚Yn0dS)zµ Upload an object to the S3 object store.

        Args:
            args (list): List of object name parts.
            options (dic): Dictionary of configuration options.
        rNFrr9rYÚrbrŒr‹)r,r.Z	ExtraArgsr0)rrŽr2r3rrYÚopenr%Zupload_fileobjr&rbr)r(rXrÚfilesÚdatar®rrr	Ú
upload_objectýs4
þ

ÿÿü
ÿþ(zS3Backend.upload_object)r)NF)N)r)r)r)Nr)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)r+r8rJr¾rOr6r€r„r‡rŠr|r5rCrr¨rªr©r¼r½r¿rÈrÉrÑrÒrŽrÚrrrr	r2s8,2
#
<"
d
 

^I3!
 
.1r)rÞrrdr}r2Zloggingr¬r"r!Zbotocore.exceptionsrZs3fuse.utilsrZBASENAMEr=r™r Z	getLoggerrÛZLOGr
Úobjectrrrrr	Ú<module>s"