
    ~                        S r SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSK	r	SSK
Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJs  Jr  SSKJr  SSKJr  SSKJ r!  SSKJ"r#  SSKJ$r$  SSKJ%r%  SSKJ&r&  SSKJ'r'  SSKJ(r(  SSKJ	r	  SSK)J*r*  SSK)J+r+  SSK,J-r-  SSK.J/r/  \" S5       " S S \R`                  5      5       r1g)!&Integration tests for rewrite command.    )absolute_import)print_function)division)unicode_literalsN)BucketStorageUri)ApiSelector)DiscardMessagesQueue)
GcsJsonApi)PopulateProjectId)#EnsureRewriteRestartCallbackHandler)"EnsureRewriteResumeCallbackHandler)HaltingRewriteCallbackHandler)RewriteHaltException)	SkipForS3)"AuthorizeProjectToUseTestingKmsKey)GenerationFromURI)ObjectToURI)SetBotoConfigForTest)TEST_ENCRYPTION_KEY1)TEST_ENCRYPTION_KEY2)TEST_ENCRYPTION_KEY3)TEST_ENCRYPTION_KEY4)unittest)DeleteTrackerFile)GetRewriteTrackerFilePath)CryptoKeyWrapperFromKey)ONE_MIBz<gsutil doesn't support S3 customer-supplied encryption keys.c                      ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r  S S jr Sr!U =r"$ )!TestRewrite6   r   c                    > [         [        U ]  5         U R                  (       a  SU l        SU l        SU l        SU l        g SU l        SU l        SU l        SU l        g )N	RewritingPatchingRotatingSkipping
Encrypting
Decrypting)superr    setUp_use_gcloud_storagerotating_messageskipping_messageencrypting_messagedecrypting_message)self	__class__s    +platform/gsutil/gslib/tests/test_rewrite.pyr*   TestRewrite.setUp:   sY    	+t"$)d(d +d +d(d(d ,d ,d    c                 h    U R                  SSU R                  -  /SSS9nU R                  SU5        g)z*Tests rewrite with no transformation flag.rewritez%s://some_urlT   return_stderrexpected_statusz1command requires at least one transformation flagN)	RunGsUtildefault_providerassertInr0   stderrs     r2   test_rewrite_missing_flag%TestRewrite.test_rewrite_missing_flagG   s?    ^^	Od&;&;;<  F 	MMEvNr4   c                    U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nUR                  nU R                  SS[        U5      < SU< 3/SSS	9nU R                  S
U5        g)z=Tests that rewrite fails on a URL that includes a generation.&Rewrite API is only supported in JSON.   barcontentsencryption_keyr6   -k#Tr7   r8   z'"rewrite" called on URL with generationN)test_apir	   XMLr   skipCreateObjectr   
generationr;   surir=   )r0   
object_urirN   r?   s       r2   test_rewrite_generation_url'TestRewrite.test_rewrite_generation_urlO   s    }}']]CDD""F2F # HJ&&J^^	D$j	1	3	  F
 	MM;VDr4   c                 z   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  SS[        S9nSS[        4SS[        4/n[        U5         U R                  SS	[        U5      /S
SS9nU R                  S[        U5      -  U5        SSS5        g! , (       d  f       g= f)z8Tests that rewrite fails when no decryption key matches.rC   foorD   )object_namerF   rG   GSUtilrG   decryption_key1r6   rH   Tr7   r8   z#No decryption key matches object %sN)rJ   r	   rK   r   rL   rM   r   r   r   r   r;   rO   r=   r0   rP   boto_config_for_testr?   s       r2   #test_rewrite_missing_decryption_key/TestRewrite.test_rewrite_missing_decryption_key]   s    }}']]CDD""u,22F # HJ &'79MN%'8:NOQ	2	3~~dD,
-  f mm9D<LL 
4	3	3s   '<B,,
B:c                 h   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9n[        U5      nSS[        4SS[        4/n[        U5         U R                  / SQUS9  S	S	S	5        U R                  U[        5        g	! , (       d  f       N%= f)
z/Tests rewrite with arguments supplied on stdin.rC   rD   rE   rV   rG   rW   )r6   rH   z-I)stdinN)rJ   r	   rK   r   rL   rM   r   rO   r   r   r;   AssertObjectUsesCSEK)r0   rP   	stdin_argrY   s       r2   test_rewrite_stdin_args#TestRewrite.test_rewrite_stdin_argsn   s    }}']]CDD""F2F # HJZ I%'79MN%'8:NOQ	2	3
nn,In> 
4i)=> 
4	3s   1B##
B1c           	      r   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nU R                  SSSS[        U5      /5        U R                  SS[        U5      /S	S
9nU R                  SU5        SS[        4SS[        4/n[        U5         U R                  SSS[        U5      /5        SSS5        U R                  [        U5      [        5        U R                  SS[        U5      /S	S
9nU R                  SU5        g! , (       d  f       N\= f)zTests rewrite with the -O flag.rC   rD   rE   aclchz-uz
AllUsers:RgetTreturn_stdoutallUsersrV   rG   rW   r6   rH   z-ON)rJ   r	   rK   r   rL   rM   r   r;   rO   r=   r   r   r^   assertNotIn)r0   rP   stdoutrY   s       r2   test_rewrite_overwrite_acl&TestRewrite.test_rewrite_overwrite_acl|   s'   }}']]CDD""F2F # HJNNE4|T*5EFG^^UE4
+;<*.  0FMM*f%%'79MN%'8:NOQ	2	3
nnitT*-=>? 
4d:.0DE^^UE4
+;<*.  0FZ( 
4	3s   3D((
D6c           	          U R                   [        R                  :X  a  [        R                  " S5      $ U R                  5       nU R                  USSS[        U5      /5        g)z.Tests rewrite command recursively on a bucket.rC   r6   rH   -rNrJ   r	   rK   r   rL   CreateBucket!_test_rewrite_key_rotation_bucketrO   r0   
bucket_uris     r2   test_rewrite_bucket_recursive)TestRewrite.test_rewrite_bucket_recursive   sR    }}']]CDD""$J**	D$Z 013r4   c                     U R                   [        R                  :X  a  [        R                  " S5      $ U R                  5       nU R                  USSSS[        US5      /5        g)z@Tests parallel rewrite command with a flat wildcard on a bucket.rC   z-d-mr6   rH   z**Nro   rr   s     r2   *test_parallel_rewrite_bucket_flat_wildcard6TestRewrite.test_parallel_rewrite_bucket_flat_wildcard   sX    }}']]CDD""$J**T4D*d+-.r4   c           	         SnU R                  USU[        S9nU R                  USU[        S9nU R                  USU[        S9nU R                  USUS9nSS	[        R                  " S
5      4SS[        R                  " S
5      4SS[        R                  " S
5      4/n[        U5         U R                  USS9n	U R                  SR                  U R                  [        U5      5      U	5        U R                  U R                  U	5        SSS5        [        U5      [        U5      [        U5      [        U5      4 H  n
U R                  U
[        5        M     SS[        4/n[        U5         U R                  USS9n	U R                  U R                  U	5        SSS5        [        U5      [        U5      [        U5      [        U5      4 H  n
U R                  U
5        M     g! , (       d  f       N= f! , (       d  f       Nb= f)zHelper function for testing key rotation on a bucket.

Args:
  bucket_uri: bucket StorageUri to use for the test.
  command_args: list of args to gsutil command.
rD   zfoo/foors   rU   rF   rG   foo/barzfoo/bazzfoo/quxrs   rU   rF   rV   rG   zutf-8rW   decryption_key2Tr9   {} {}N)rM   r   r   r   decoder   r;   r=   formatr-   rO   r,   r^   r/   AssertObjectUnencrypted)r0   rs   command_argsobject_contentsobject_uri1object_uri2object_uri3object_uri4rY   r?   object_uri_strboto_config_for_test2s               r2   rq   -TestRewrite._test_rewrite_key_rotation_bucket   s    O##z09-<3G $ IK ##z09-<3G $ IK ##z09-<3G $ IK ##z09-< $ >K 
#%9%@%@%IJ	$&:&A&A'&JK	$&:&A&A'&JK 
2	3~~l$~?f
mmGNN4#8#8${:KL mmD))62 
4  ,d;.?,d;.?A
0DEA
 '(9;OP  
3	4~~l$~?f
mmD++V4 
5  ,d;.?,d;.?A
"">2A' 
4	3 
5	4s   +A"G)1-G:)
G7:
Hc           	      T   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nSS[        4SS/n[        U5         U R                  SS	S
[        U5      /SS9nU R                  SU5        S S S 5        g ! , (       d  f       g = f)NrC   rD   rE   rV   rW   )rV   task_estimation_threshold1)rV   task_estimation_forceTruerw   r6   rH   Tr   z:Estimated work for this command: objects: 1, total size: 3rJ   r	   rK   r   rL   rM   r   r   r;   rO   r=   rX   s       r2   test_rewrite_seek_ahead#TestRewrite.test_rewrite_seek_ahead   s    }}']]CDD""F2F # HJ &'8:NOHGI 
2	3~~D$z"2
34  If
mm
FP 
4	3	3s    0B
B'c           	         U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nU R                  SS9nSS[        4SS[        4/n[        U5         U R                  SS	S
[        U5      /SSS9nU R                  SU5        U R                  SS	S
[        U5      /SSS9nU R                  SU5        S S S 5        g ! , (       d  f       g = f)NrC   rD   rE   rF   rV   rG   rW   r6   -sdraTr7   r8   EncryptionException)rJ   r	   rK   r   rL   rM   r   r   r   r;   rO   r=   )r0   encrypted_obj_uriunencrypted_obj_urirY   r?   s        r2   -test_rewrite_unintentional_key_rotation_fails9TestRewrite.test_rewrite_unintentional_key_rotation_fails   s	   }}']]CDD))69M * O++V+<%'79MN%'8:NOQ	2	3 ~~y$#$568,0./  1f mm)62 ~~dE#$&	  f
 mm)62 
4	3	3s   5A!C
C-c                    U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nSS[        4SS[        4/n[        U5         U R                  SS[        U5      /S	S
9nU R                  U R                  U5        S S S 5        U R                  [        U5      [        5        SS[        4/n[        U5         U R                  SS[        U5      /S	S
9nU R                  U R                  U5        S S S 5        U R                  [        U5      5        g ! , (       d  f       N= f! , (       d  f       N:= f)NrC   rD   rE   rV   rG   rW   r6   rH   Tr   )rJ   r	   rK   r   rL   rM   r   r   r   r;   rO   r=   r,   r^   r/   r   )r0   rP   rY   r?   r   s        r2   'test_rewrite_key_rotation_single_object3TestRewrite.test_rewrite_key_rotation_single_object  sE   }}']]CDD""F2F # HJ &'79MN%'8:NOQ 
2	3~~dD,
-T  Cf
mmD))62 
4
 	d:.0DE '(9;OP 	3	4~~dD,
-T  Cf
mmD++V4 
5
 	  j!12 
4	3 
5	4s   &9D79E7
E
Ec           	         U R                   [        R                  :X  a  [        R                  " S5      $ U R                  5       nSn[        US5      nU R                  USU[        S9nU R                  USU[        S9nU R                  USU[        S9nU R                  USUS	9nS
S[        4S
S[        4S
S[        4/nU R                  US5        [        U5         U R                  SSSU/SS9n	U R                  U R                  U	5        U R                  SR!                  U R"                  [        U5      5      U	5        U R                  U R$                  U	5        S S S 5        U R'                  [        U5      [        5        [        U5      [        U5      [        U5      4 H  n
U R'                  U
[        5        M     S
S[        4/n[        U5         U R                  SSSU/SS9n	U R                  U R(                  U	5        S S S 5        U R'                  [        U5      [        5        [        U5      [        U5      [        U5      4 H  n
U R+                  U
5        M     g ! , (       d  f       GN= f! , (       d  f       Nx= f)NrC   rD   barr|   r{   zbar/foozbar/bazzbar/quxr}   rV   rG   rW   r~      r6   rn   rH   Tr   r   )rJ   r	   rK   r   rL   rp   rO   rM   r   r   r   AssertNObjectsInBucketr   r;   r=   r,   r   r-   r.   r^   r/   r   )r0   rs   r   rotate_subdirr   r   r   r   rY   r?   r   r   s               r2   'test_rewrite_key_rotation_bucket_subdir3TestRewrite.test_rewrite_key_rotation_bucket_subdir  s   }}']]CDD""$JOU+M##z09-<3G $ IK ##z09-<3G $ IK ##z09-<3G $ IK ##z09-< $ >K
 &'79MN%'8:NO%'8:NOQ 	
A.	2	3~~y$mD,0  2f mmD))62
mmGNN4#8#8${:KL
mmD++V4 
4 	d;/1EF,d;.?,.
0DE.
 '(9;OP  
3	4~~y$mD,0  2f
mmD++V4 
5 	d;/1EF,d;.?,.
"">2.; 
4	3* 
5	4s   BI)1I;)
I8;
J	c           	      P   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nSS[        4/n[        U5         U R                  SSS[        U5      /S	S
9nU R                  SU5        S S S 5        g ! , (       d  f       g = f)NrC   rD   rE   rV   rG   r6   r   nearlineTr   r#   r   rX   s       r2   >test_rewrite_with_nonkey_transform_works_when_key_is_unchangedJTestRewrite.test_rewrite_with_nonkey_transform_works_when_key_is_unchangedZ  s     }}']]CDD""F2F # HJ%'79MNO	2	3~~y$
#J/1,0  2f mmK(	 
4	3	3s   0B
B%c           
      *   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        S9nSS[        4SS[        4/n[        U5         U R                  SSS	S
[        U5      /SS9nU R                  U R                  U5        S S S 5        U R                  [        U5      [        5        U R                  S[        U5      /SS9nU R                  US[        R                   SS9  g ! , (       d  f       Ni= f)NrC   rD   rE   rV   rG   rW   r6   r   r   rH   Tr   statrf   Storage class:\s+NEARLINE/Storage class appears not to have been changed.flagsmsg)rJ   r	   rK   r   rL   rM   r   r   r   r;   rO   r=   r,   r^   assertRegexpMatchesWithFlagsre
IGNORECASE)r0   rP   rY   r?   rj   s        r2   3test_rewrite_key_rotation_with_storage_class_change?TestRewrite.test_rewrite_key_rotation_with_storage_class_changel  s   }}']]CDD""F2F # HJ &'79MN%'8:NOQ	2	3~~dJ
  f mmD))62 
4 	d:.0DE^^VT*%56d^KF%%$mm>	 & A 
4	3s   &;D
Dc                 ^   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  SS9nU R                  SSS[        U5      /SS9nU R                  S	U5        U R                  S
[        U5      /SS9nU R                  US[        R                  SS9  g )NrC   rD   r   r6   r   r   Tr   r#   r   rf   r   r   r   )rJ   r	   rK   r   rL   rM   r;   rO   r=   r   r   r   )r0   rP   r?   rj   s       r2   +test_rewrite_with_only_storage_class_change7TestRewrite.test_rewrite_with_only_storage_class_change  s    }}']]CDD""F"3J ^^Yj!*-/*.  0F 	MM+v&^^VT*%56d^KF%%$mm>	 & Ar4   c                 .   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  SS9nU R                  SSS[        U5      /SS9nU R                  S	R                  U R                  [        U5      5      U5        g )
NrC   rD   r   r6   r   standardTr   r   )rJ   r	   rK   r   rL   rM   r;   rO   r=   r   r-   )r0   rP   r?   s      r2   -test_rewrite_to_same_storage_class_is_skipped9TestRewrite.test_rewrite_to_same_storage_class_is_skipped  s    }}']]CDD""F"3J^^Yj!*-/*.  0F 	MM'..!6!6Z8HIr4   c           
         U R                   [        R                  :X  a  [        R                  " S5      $ U R                  S[        SS9nSS[        4/n[        U5         U R                  SSS	S[        U5      /S
S9nS S S 5        U R                  SR                  U R                  [        U5      5      W5        g ! , (       d  f       ND= f)NrC      foor   )rF   rG   storage_classrV   rG   r6   rH   r   Tr   r   )rJ   r	   rK   r   rL   rM   r   r   r;   rO   r=   r   r-   rX   s       r2   7test_rewrite_with_same_key_and_storage_class_is_skippedCTestRewrite.test_rewrite_with_same_key_and_storage_class_is_skipped  s    }}']]CDD""F2F1; # =J &'79MNO	2	3~~dD*
  f 
4
 	MM'..!6!6Z8HI 
4	3s   B<<
C
c                     U R                   [        R                  :X  a  [        R                  " S5      $ U R                  / SQSSS9nU R                  SU5        U R                  SU5        g )NrC   )r6   r   zgs://some-random-nameTr7   r8   CommandExceptionzexpects at least one URL)rJ   r	   rK   r   rL   r;   r=   r>   s     r2   &test_rewrite_with_no_value_for_minus_s2TestRewrite.test_rewrite_with_no_value_for_minus_s  s^    }}']]CDD^^F*.,-  /F 	MM$f-MM,f5r4   c                 8    U R                  [        [        5        g )N)_test_rewrite_resume_or_restartr   r   r0   s    r2   test_rewrite_resumeTestRewrite.test_rewrite_resume  s    (()=)=?r4   c                 >    U R                  [        [        [        S9  g )N)new_dec_keyr   r   r   r   r   s    r2   5test_rewrite_resume_restart_source_encryption_changedATestRewrite.test_rewrite_resume_restart_source_encryption_changed      (()=)=5I ) Kr4   c                 >    U R                  [        [        [        S9  g )N)new_enc_keyr   r   s    r2   3test_rewrite_resume_restart_dest_encryption_changed?TestRewrite.test_rewrite_resume_restart_dest_encryption_changed  r   r4   c                 H    U R                  [        [        [        [        S9  g )N)r   r   )r   r   r   r   r   r   s    r2   3test_rewrite_resume_restart_both_encryption_changed?TestRewrite.test_rewrite_resume_restart_both_encryption_changed  s"    (()=)=5I5I ) Kr4   c                    U R                   [        R                  :X  a  [        R                  " S5      $ [        5       nU R                  SS9nSSU4/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  W5        U R                  [        U5      U5        S
/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  U5        U R                  [        U5      5        g ! , (       d  f       N= f! , (       d  f       NV= f)NrC   r   r   rV   rG   r6   rH   Tr   rV   rG   N)rJ   r	   rK   r   rL   r   rM   r   r;   rO   r=   r.   AssertObjectUsesCMEKr/   r   r0   key_fqnrP   rY   r?   s        r2   $test_rewrite_to_kms_then_unencrypted0TestRewrite.test_rewrite_to_kms_then_unencrypted  s%   }}']]CDD02G""F"3J%'7AB	2	3~~dD,
-T  Cf 
4 	MM$))62d:.8 ??	2	3~~dD,
-T  Cf 
4 	MM$))62  j!12 
4	3 
4	3s   D%	D6%
D36
Ec                    U R                   [        R                  :X  a  [        R                  " S5      $ [        5       nU R                  SS9nSSU4/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  W5        U R                  [        U5      U5        SS[        4/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  U5        U R                  [        U5      [        5        g ! , (       d  f       N= f! , (       d  f       N[= f)
NrC   r   r   rV   rG   r6   rH   Tr   )rJ   r	   rK   r   rL   r   rM   r   r;   rO   r=   r.   r   r   r,   r^   r   s        r2   test_rewrite_to_kms_then_csek)TestRewrite.test_rewrite_to_kms_then_csek  s1   }}']]CDD02G""F"3J%'7AB	2	3~~dD,
-T  Cf 
4 	MM$))62d:.8 &'79MNO	2	3~~dD,
-T  Cf 
4 	MM$''0d:.0DE 
4	3 
4	3s   D1E1
D?
Ec                    U R                   [        R                  :X  a  [        R                  " S5      $ [        5       nU R                  SS9nSS[        4/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  W5        U R                  [        U5      [        5        SSU4SS
[        4/n[        U5         U R                  SS[        U5      /SS	9nS S S 5        U R                  U R                  U5        U R                  [        U5      U5        g ! , (       d  f       N= f! , (       d  f       NW= f)NrC   r   r   rV   rG   r6   rH   Tr   rW   )rJ   r	   rK   r   rL   r   rM   r   r   r;   rO   r=   r.   r^   r,   r   r   s        r2   test_rewrite_to_csek_then_kms)TestRewrite.test_rewrite_to_csek_then_kms  sA   }}']]CDD02G""F"3J%'79MNO	2	3~~dD,
-T  Cf 
4 	MM$))62d:.0DE 
#W-	$&:; 
2	3~~dD,
-T  Cf 
4 	MM$''0d:.8 
4	3 
4	3s   #D9E
9
E

Ec           	         U R                   [        R                  :X  a  [        R                  " S5      $ [        5       nU R                  5       nU R                  USSS9nU R                  SSSU[        U5      /5        [        S/5         U R                  S	S[        U5      /S
S9nS S S 5        U R                  SW5        U R                  [        U5      U5        g ! , (       d  f       N<= f)NrC   rT   r   r}   kms
encryptionrH   r   r6   Tr   r#   )rJ   r	   rK   r   rL   r   rp   rM   r;   rO   r   r=   r   )r0   r   rs   rP   r?   s        r2   Ctest_rewrite_with_no_encryption_key_operates_on_unencrypted_objectsOTestRewrite.test_rewrite_with_no_encryption_key_operates_on_unencrypted_objects  s    }}']]CDD 12G ""$J""j/4,2 # 4J
 	NNE<wZ8HIJ 
AB	C~~dD,
-T  Cf 
D 	MM+v&d:.8	 
D	Cs   C
C,c           
         U R                   [        R                  :X  a  [        R                  " S5      $ U R                  5       nU R                  SS9nU R                  USS[        -  S-   SUS9nU R                  USS	SUS9n[        [        [        R                  " 5       [        5       U R                  5      n	[        S
SU4/5         U	R                  UR                   UR"                  U R                  / SQS9n
SSS5        U	R                  UR                   UR"                  U R                  / SQS9n[%        W
R&                  U
R(                  UR&                  UR(                  U R                   5      n[+        U5      n[+        U=(       d    U5      n[+        U5      n[+        U=(       d    U5      n  U	R-                  U
U[/        [        S-  5      R0                  [        UUS9  U R3                  S5        U R7                  [8        R:                  R=                  U5      5        U(       a'  U R                  USS[        -  S-   SU[?        U5      S9  [        S
SU=(       d    U4/5         U	R                  U
R&                  U
R(                  SS/S9R@                  nSSS5        U(       d  U(       a  [C        [        5      R0                  nO[E        [        S-  5      R0                  nU	R-                  U
UU[        UUS9  U RG                  [8        R:                  R=                  U5      5        U=(       d    Un[        S
SU4/5         U RI                  WU	R                  UR&                  UR(                  SS/S9R@                  S5        SSS5        [K        U5        g! , (       d  f       GN= f! [4         a     GNf = f! , (       d  f       GN-= f! , (       d  f       NO= f! [K        U5        f = f)a  Tests that the rewrite command restarts if the object's key changed.

Args:
  initial_dec_key: Initial key the object is encrypted with, used as
      decryption key in the first rewrite call.
  initial_enc_key: Initial encryption key to rewrite the object with,
      used as encryption key in the first rewrite call.
  new_dec_key: Decryption key for the second rewrite call; if specified,
      object will be overwritten with a new encryption key in between
      the first and second rewrite calls, and this key will be used for
      the second rewrite call.
  new_enc_key: Encryption key for the second rewrite call; if specified,
      this key will be used for the second rewrite call, otherwise the
      initial key will be used.

Returns:
  None
rC   NEARLINE)r   rT   s   12rD   T)rs   rU   rF   prefer_json_apirG   testrV   rW   )bucketcontentTypeetagname)providerfieldsN   )progress_callbackmax_bytes_per_calldecryption_tupleencryption_tuplezExpected RewriteHaltException.)rs   rU   rF   r   rG   gs_idempotent_generationcustomerEncryptionmd5Hash)r   rG   z;Error: Rewritten object's hash doesn't match source object.)&rJ   r	   rK   r   rL   rp   rM   r   r   r   logging	getLoggerr
   r<   r   GetObjectMetadatabucket_namerU   r   r   r   r   
CopyObjectr   callfailr   
assertTrueospathexistsurigenr   r   r   assertFalseassertEqualr   )r0   initial_dec_keyinitial_enc_keyr   r   rs   destination_bucket_urirP   destination_object_uri
gsutil_apisrc_obj_metadatadst_obj_metadatatracker_file_namer   decryption_tuple2r   encryption_tuple2original_md5r   final_enc_keys                       r2   r   +TestRewrite._test_rewrite_resume_or_restart.  s   . }}']]CDD""$J "..Z.H ""j/4-2W_,F372A	 # CJ
 "..)& / ( ,g.?.?.A02D4I4IKJ	*;_MN	O#55

 
 

 
 ((:	 6 < 
P "33****&&8	 4 :
 22B2I2I2B2G2G2B2I2I2B2G2G26--	A
 /?/0NO.?/0NO>+
..0M")A+1//3t18/?/? 	 	A 			23
 oobggnn%678	Z&+$)GOv#=*.)439*3E 	 	G  (,={ @2"1"3 !4 5!33##!!()4 4 6 7>g 	5 
?HMM ?w{KPP ,,.?/6->->  @ rww~~&789!4_m(,<m!L MN(( '' %%,i8 ) : ;B'K	M O )*g 
P	O> " 5 56 ON )*sj   
3N$8AN6 ;A4O* /2O!B,O* AOO* $
N36
O O* OO* 
OO* 
O'#O* *O7)r/   r.   r,   r-   )NN)#__name__
__module____qualname____firstlineno____doc__r*   r@   rQ   rZ   r`   rk   rt   rx   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r1   s   @r2   r    r    6   s    .-OE"?)(3.43lP3436<3|)$A0A$ 6?K
K
K3*F*909B 3726	A+ A+r4   r    )2r  
__future__r   r   r   r   r   r  r   r   boto.storage_urir   gslib.cs_api_mapr	   gslib.discard_messages_queuer
   gslib.gcs_json_apir   gslib.project_idr   gslib.tests.rewrite_helperr   r   r   r   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   gslib.tests.utilr   r   r	  r   rO   r   r   r   r   r   gslib.tracker_filer   r   gslib.utils.encryption_helperr   gslib.utils.unit_utilr   GsUtilIntegrationTestCaser     r4   r2   <module>r1     s    - & %  '  	 	  - ( = ) . J I D ; ' ' ? ? 8 0 1 1 1 1 1 % 0 8 A ) JKx	+(44 x	+ Lx	+r4   