o La)(@srddlmZddlZddlZddlmZddlmZddlmZddlm Z Gdddej j Z ej d e dS) )strN)config)log)util)BackendExceptionc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) SwiftBackendz Backend for Swift c Cs2tjj||zddlm}ddlm}ddlm}Wnt y0}zt dt |d}~ww||_ i}i}i}dt jvrSdt jvrSt jd|d<t jd|d <ni||_|j|j} WnB|y}ztd5|jjt |fWYd}~n'd}~wty}zt d5|jjt |ftj!j"WYd}~nd}~ww| dur3t#d6|jz| rt$| | ggnd}|jj%|j|d7WnFty2}zt d8|jjt |ftj!j"WYd}~n(d}~ww| rO| | &| krOt d9|j| | &| fntd:| ztd;|||d<|_'|j'(|j}Wn#|y}zt d5|jjt |ftj!j"WYd}~nd}~wwtd=|dS)?Nr) SwiftService) Connection)ClientExceptionzDSwift backend requires the python-swiftclient library. Exception: %sSWIFT_PREAUTHURLSWIFT_PREAUTHTOKEN preauthurl preauthtokenSWIFT_USERNAMEz,SWIFT_USERNAME environment variable not set.SWIFT_PASSWORDz,SWIFT_PASSWORD environment variable not set. SWIFT_AUTHURLz+SWIFT_AUTHURL environment variable not set. os_usernameuser os_passwordkey os_auth_urlauthurlSWIFT_AUTHVERSION auth_version3SWIFT_USER_DOMAIN_NAMEuser_domain_nameSWIFT_USER_DOMAIN_IDuser_domain_idSWIFT_PROJECT_DOMAIN_NAMEproject_domain_nameSWIFT_PROJECT_DOMAIN_IDproject_domain_idSWIFT_TENANTNAME tenant_nameSWIFT_ENDPOINT_TYPE endpoint_type SWIFT_USERIDuser_idSWIFT_TENANTID tenant_idSWIFT_REGIONNAME region_name1os_ os_optionscSsg|]}|dkr|qS)).0xr1r1A/usr/lib/python3/dist-packages/duplicity/backends/swiftbackend.py psz)SwiftBackend.__init__../z%s/r0zX-Storage-Policyz'Starting connection with arguments:'%s'zConnection failed: %s %szCreating container %s)headersz Container creation failed: %s %sz>Container '%s' exists but its storage policy is '%s' not '%s'.zContainer already created: %szStarting Swiftservice: '%s'optionszContainer stats: %sr1)) duplicitybackendBackend__init__swiftclient.servicer swiftclientr r ImportErrorrrresp_excosenvironupdatekeyspathsplitpop containerjoinprefixrswift_storage_policyrDebugconnhead_container __class____name__ Exception FatalError ErrorCodeconnection_failedInfodict put_containerlowersvcstat)self parsed_urlrr r e conn_kwargsr/ svc_optionsr url_partspolicy policy_headercontainer_metadatar7container_statr1r1r4r=#s                      zSwiftBackend.__init__cCs&t||jr|jdkrtjjSdSdS)Ni) isinstancerA http_statusrrTbackend_not_found)r\ operationr^r1r1r4 _error_codes  zSwiftBackend._error_codec Cst|j}tjdkrQddlm}t|}|j tjkrQt d|j j |j|||jt|dgdtjid}dd|D}|D] }|d sNt|d qBdS|jt|} t d || |jf|jj|j|jt|t|d d dS)Nr)SwiftUploadObjectzUploading Dynamic Large Object) object_name segment_sizer8cSsg|] }d|dvr|qS)rIactionr1r2ar1r1r4r5sz%SwiftBackend._put..success tracebackz/Uploading '%s' to '%s' in remote container '%s'rb)rIobjcontents)rfsdecodenamermp_segment_sizer>rkrBr[st_sizerrMrZuploadrIrKrrN put_objectopen) r\ source_pathremote_filenamelprkstmpuploadsrzrpr1r1r4_puts2         zSwiftBackend._putcCsj|jj|j|jt|dd\}}t|jd}|D]}||qWddS1s.wYdS)Ni)resp_chunk_sizewb) rN get_objectrIrKrrvr|rwwrite)r\r~ local_pathr7bodyfchunkr1r1r4_gets   "zSwiftBackend._getcs,jjjdjd\}}fdd|DS)NT) full_listingrFcs"g|] }|dtjdqS)rwN)lenrK)r2or\r1r4r5s"z&SwiftBackend._list..)rN get_containerrIrK)r\r7objsr1rr4_listszSwiftBackend._listcCs,dd|j|j|jt|gD}dS)NcSg|]}|qSr1r1ror1r1r4r5z(SwiftBackend._delete..)rZdeleterIrKrrv)r\filenamedeletedr1r1r4_deletes,zSwiftBackend._deletecCs`dd|j|j|jt|gDd}dt|ddi}tdt||df|S)NcSrr1r1ror1r1r4r5rz'SwiftBackend._query..rsizer7zcontent-lengthzObjectquery: '%s' has size %s.) rZr[rIrKrrvintrrM)r\rsobjectsobjr1r1r4_querys,zSwiftBackend._queryN) rQ __module__ __qualname____doc__r=rjrrrrrr1r1r1r4rs rswift)builtinsrrBduplicity.backendr:rrrduplicity.errorsrr;r<rregister_backendr1r1r1r4s     <