
    s                         d Z ddlmZ ddlZddlZddlmc mZ ddlm	Z	 ddlm
Z
 ddlmZ dZdZeez  Zd	Z eeez        Z G d
 dej(                        Zy)(Integration tests for retention command.    )absolute_importN)	SkipForS3)
SkipForXML)ObjectToURIiQ    g     v@c                      e Zd ZdZ ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d	               Z	 ed       ed      d
               Z
 ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d               Z ed       ed      d                Z  ed       ed      d!               Z! ed       ed      d"               Z" ed       ed      d#               Z# ed       ed      d$               Z$ ed       ed      d%               Z% ed       ed      d&               Z& ed       ed      d'               Z' ed       ed      d(               Z(	 	 	 d-d*Z)	 d.d+Z*d, Z+y))/TestRetentionr   z*Retention is not supported for s3 objects.z'Retention is not supported for XML API.c                     | j                         }| j                  dddt        |      g       | j                  |d       y )N	retentionset60s<   $expected_retention_period_in_seconds)CreateBucket	RunGsUtilsuriVerifyRetentionPolicyself
bucket_uris     -platform/gsutil/gslib/tests/test_retention.pytest_set_retention_secondsz(TestRetention.test_set_retention_seconds%   sE     ""$JNNKtJ/?@AzDF  H    z)Retention is not supported for s3 objectsz&Retention is not supported for XML APIc                     | j                         }| j                  dddt        |      g       | j                  |t               y )Nr   r   1dr   )r   r   r   r   _SECONDS_IN_DAYr   s     r   test_set_retention_daysz%TestRetention.test_set_retention_days-   sE     ""$JNNKd:.>?@  Jr   c                     | j                         }| j                  dddt        |      g       | j                  |t               y )Nr   r   1mr   )r   r   r   r   _SECONDS_IN_MONTHr   s     r   test_set_retention_monthsz'TestRetention.test_set_retention_months5   sF     ""$JNNKd:.>?@9J  Lr   c                     | j                         }| j                  dddt        |      g       | j                  |t               y Nr   r   1yr   r   r   r   r   _SECONDS_IN_YEARr   s     r   test_set_retention_yearsz&TestRetention.test_set_retention_years=   sF     ""$JNNKd:.>?@9I  Kr   c           	          | j                         }| j                         }| j                  dddt        |      t        |      g       | j                  |t               | j                  |t               y r%   r'   r   bucket1_uribucket2_uris      r   &test_set_retention_multiple_sequentialz4TestRetention.test_set_retention_multiple_sequentialE   s~     ##%K##%KNN	eT	k		k		
 	:J  L:J  Lr   c           
          | j                         }| j                         }| j                  ddddt        |      t        |      g       | j                  |t               | j                  |t               y )N-mr   r   r&   r   r'   r+   s      r   $test_set_retention_multiple_parallelz2TestRetention.test_set_retention_multiple_parallelU   s     ##%K##%KNN	{E4	k		k		
 	:J  L:J  Lr   c                     | j                  t              }| j                  dddt        |      g       | j	                  |t
               y )Nretention_period_in_secondsr   r   r!   r   )CreateBucketWithRetentionPolicyr   r   r   r   r"   r   s     r    test_increase_retention_unlockedz.TestRetention.test_increase_retention_unlockede   sP     55$3 6 5JNNKd:.>?@9J  Lr   c                     | j                  t              }| j                  dddj                  t              t        |      g       | j                  |t               y )Nr3   r   r   {}sr   )r5   r"   r   formatr   r   r   r   s     r    test_decrease_retention_unlockedz.TestRetention.test_decrease_retention_unlockedn   s`     55$5 6 7JNN	eU\\/:	j		 	  Jr   c                     | j                  t              }| j                  ddt        |      g       | j	                  |d        y )Nr3   r   clearr   r5   r   r   r   r   r   s     r   test_clear_unlocked_retentionz+TestRetention.test_clear_unlocked_retentiony   sM     55$3 6 5JNNK$z*:;<zDH  Jr   c                     | j                         }| j                  dddt        |      gdd      }| j                  |d       y )Nr   r   1a   Texpected_statusreturn_stderrz$Incorrect retention period specifiedr   r   r   assertRegexr   r   stderrs      r   'test_set_retention_unlocked_invalid_argz5TestRetention.test_set_retention_unlocked_invalid_arg   sO     ""$J^^	eT4
#34  F 	VDEr   c                     | j                  t              }| j                  ddt        |      gd       | j	                  |t        d       y )Nr3   r   locky)stdinTr   expected_is_lockedr=   r   s     r    test_lock_retention_userConfirmsz.TestRetention.test_lock_retention_userConfirms   sT     55$3 6 5JNNKj)9:#NF-<  !r   c                     | j                  t              }| j                  ddt        |      gdd      }| j	                  |d       | j                  |t               y )	Nr3   r   rK   nTrM   rD   z*Abort [Ll]ocking [Rr]etention [Pp]olicy onr   )r5   r   r   r   rF   r   rG   s      r   &test_lock_retention_userDoesNotConfirmz4TestRetention.test_lock_retention_userDoesNotConfirm   sm     55$3 6 5J^^	fd:./s$  PFVIJ  Jr   c                     | j                         }| j                  ddt        |      gddd      }| j                  |d       | j	                  |d        y )	Nr   rK   rL   rA   TrM   rC   rD   z3does not have a(n Unlocked)? [Rr]etention [Pp]olicyr   )r   r   r   rF   r   rG   s      r   *test_lock_with_no_retention_policy_invalidz8TestRetention.test_lock_with_no_retention_policy_invalid   sl     ""$J^^	fd:./	  F
 	VJLzDH  Jr   c                     | j                         }| j                  dddt        |      gddd      }| j                  |d       y )	Nr   rK   -arL   rA   TrV   zIncorrect option\(s\) specifiedrE   rG   s      r   $test_lock_retention_with_invalid_argz2TestRetention.test_lock_retention_with_invalid_arg   sR     ""$J^^	fdD$45	  F
 	V?@r   c                     | j                  t        d      }| j                  ddt        |      gdd      }| j	                  |d       y )NTr4   	is_lockedr   rK   rL   rS   z+Retention [Pp]olicy on .* is already lockedr5   r   r   r   rF   rG   s      r   "test_lock_retention_already_lockedz0TestRetention.test_lock_retention_already_locked   sW     55$3t 6 EJ^^	fd:./s$  PFVKLr   c                     | j                  t        d      }| j                  dddj                  t        dz         t	        |      g       | j                  |t        dz   d       y )NTr\   r   r   r8   rA   rN   )r5   r   r   r9   r   r   r   s     r   test_increase_retention_lockedz,TestRetention.test_increase_retention_locked   sp     55$3t 6 EJNNUELL1)<=Z  	-<q-@  !r   c                     | j                  t        d      }| j                  dddj                  t        dz
        t	        |      gdd      }| j                  |d       y )	NTr\   r   r   r8   rA   rB   zHCannot reduce retention duration of a locked Retention Policy for bucket)r5   r   r   r9   r   rF   rG   s      r   test_decrease_retention_lockedz,TestRetention.test_decrease_retention_locked   st     55$3t 6 EJ^^UELL1)<=Z -.*.  0F 	 -.r   c                     | j                  t        d      }| j                  ddt        |      gdd      }| j	                  |d       y )NTr\   r   r<   rA   rB   z?Bucket .* has a locked Retention Policy which cannot be removedr^   rG   s      r   test_clear_locked_retentionz)TestRetention.test_clear_locked_retention   s^     55$3t 6 EJ^^	gtJ/0  F 	JLr   c                 ^   | j                  t        d      }| j                  dddt        |      gd      }| j                  r7| j                  |d       | j                  |d       | j                  |d	       n6| j                  |d
       | j                  |d       | j                  |d       | j                  j                  |j                  dg      j                  }| j                  rOt        j                  j                  t        j                  d|      j                  d            }|j                  }n^| j!                  t        j                  d|      j                               }| j#                  |j                  j%                  d             }| j'                  ||       y )NTr\   z-DDr   getreturn_stdoutzisLocked\: trueretentionPeriod\: \'86400\'effectiveTime\: \'.*\'zRetention Policy \(LOCKED\):Duration: 1 Day\(s\)Effective Time: .* GMTretentionPolicyfieldseffectiveTime\: \'(.*)\'rA   (?<=Time: )[\w,: ]+tzinfo)r5   r   r   r   _use_gcloud_storagerF   json_api	GetBucketbucket_namern   datetimefromisoformatresearchgroupeffectiveTime_ConvertTimeStringToSecondsDateTimeToSecondsreplaceassertEqualr   r   stdoutactual_retention_policyexpected_effective_timeactual_effective_times         r   test_get_retention_lockedz'TestRetention.test_get_retention_locked   s    55$3t 6 EJ^^	UD$45T  KF
v12
v=>
v89
v>?
v67
v89"mm55(9': 6 <<KO   ( 1 1 ? ?
))/
8
>
>q
A!C5CC $ @ @
))*F
3
9
9
;!="44
!
/
/
7
7t
7
DF*,CDr   c                 Z   | j                  t              }| j                  ddt        |      gd      }| j                  r7| j                  |d       | j                  |d       | j                  |d       n6| j                  |d	       | j                  |d
       | j                  |d       | j                  j                  |j                  dg      j                  }| j                  rOt        j                  j                  t        j                  d|      j                  d            }|j                   }n^| j#                  t        j                  d|      j                               }| j%                  |j                   j'                  d             }| j)                  ||       y )Nr3   r   rg   Trh   zisLocked \: truerj   rk   zRetention Policy \(UNLOCKED\):rl   rm   rn   ro   rq   rA   rr   rs   )r5   r   r   r   ru   assertNotRegexrF   rv   rw   rx   rn   ry   rz   r{   r|   r}   r~   r   r   r   r   r   s         r   test_get_retention_unlockedz)TestRetention.test_get_retention_unlocked  s    55$3 6 5J^^	eT*-.d  DF
&"56
v=>
v89
v@A
v67
v89"mm55(9': 6 <<KO   ( 1 1 ? ?
))/
8
>
>q
A!C5CC $ @ @
))*F
3
9
9
;!="44
!
/
/
7
7t
7
DF 	*,CDr   c                     | j                         }| j                  ddt        |      gd      }| j                  r| j	                  |d       y | j	                  |d       y )Nr   rg   Trh   nullzhas no Retention Policy)r   r   r   ru   rF   )r   r   r   s      r   test_get_no_retentionz#TestRetention.test_get_no_retention*  sa     ""$J^^	eT*-.d  DF
vv&
v89r   c                     | j                  t              }| j                  dddt        |      gdd      }| j	                  |d       y )	Nr3   r   rg   rY   rA   TrB   z Incorrect option\(s\) specified.r^   rG   s      r   test_get_invalid_argsz#TestRetention.test_get_invalid_args5  sY     55$3 6 5J^^	eT4
#34  F 	V@Ar   c                     | j                         }| j                  dddt        |      gdd      }| j                  |d       y )Nr   tempheldrA   TrB   z8Invalid subcommand ".*" for the "retention temp" commandCreateObjectr   r   rF   r   
object_urirH   s      r   #test_set_temporary_hold_invalid_argz1TestRetention.test_set_temporary_hold_invalid_arg@  sU     ""$J^^[&&!*-/,-*.  0F 	KMr   c                 :   | j                         }| j                  |d      }| j                  ||d        | j                  dddt	        |      g       | j                  ||d       | j                  dddt	        |      g       | j                  ||d	       y )
Ncontentr   contentstemporary_holdr   r   r   TreleaseFr   r   #_VerifyObjectHoldAndRetentionStatusr   r   r   r   r   s      r   ,test_temporary_hold_bucket_with_no_retentionz:TestRetention.test_temporary_hold_bucket_with_no_retentionK  s     ""$J""j9"MJ,,Z-7<@ - B 	NNKZ0@AB,,Z-7<@ - B 	NNKD4DEF,,Z-7<A - Cr   c                 F   d}| j                  |      }| j                  |d      }| j                  ||d |       | j                  dddt	        |      g       | j                  ||d|       | j                  ddd	t	        |      g       | j                  ||d
|       y )NrA   r   r   )r   retention_periodr   r   r   Tr   Fr5   r   r   r   r   r   r   r   r   s       r   )test_temporary_hold_bucket_with_retentionz7TestRetention.test_temporary_hold_bucket_with_retention\  s     556FGJ""j9"MJ,,Z-7<@>N - P 	NNKZ0@AB,,Z-7<@>N - P 	NNKD4DEF,,Z-7<A>N - Pr   c           	         | j                         }| j                  |d      }| j                  |d      }| j                  dddt        |      t        |      g       | j	                  ||d       | j	                  ||d       | j                  dddt        |      t        |      g       | j	                  ||d	       | j	                  ||d	       y )
Nr   r   r   r   r   Tr   r   Fr   r   r   r   r   r   r   object1_uriobject2_uris       r   'test_temporary_hold_multiple_sequentialz5TestRetention.test_temporary_hold_multiple_sequentialq  s    ""$J##zI#NK##zI#NKNN	fe	k		k		 	,,Z-8<@ - B 	,,Z-8<@ - B 	NN	fi	k		k		 	,,Z-8<A - C 	,,Z-8<A - Cr   c           
         | j                         }| j                  |d      }| j                  |d      }| j                  ddddt        |      t        |      g       | j	                  ||d       | j	                  ||d       | j                  dddd	t        |      t        |      g       | j	                  ||d
       | j	                  ||d
       y )Nr   r   r0   r   r   r   Tr   r   Fr   r   s       r   %test_temporary_hold_multiple_parallelz3TestRetention.test_temporary_hold_multiple_parallel  s
    ""$J##zI#NK##zI#NKNNk65[[ 
 	,,Z-8<@ - B 	,,Z-8<@ - B 	NNk69[[ 
 	,,Z-8<A - C 	,,Z-8<A - Cr   c                     | j                         }| j                  dddt        |      gdd      }| j                  |d       y )Nr   eventrelrA   TrB   z9Invalid subcommand ".*" for the "retention event" commandr   r   s      r   %test_set_event_based_hold_invalid_argz3TestRetention.test_set_event_based_hold_invalid_arg  sU     ""$J^^['5!*-/,-*.  0F 	LNr   c                 :   | j                         }| j                  |d      }| j                  ||d        | j                  dddt	        |      g       | j                  ||d       | j                  dddt	        |      g       | j                  ||d	       y )
Nr   r   event_based_holdr   r   r   Tr   Fr   r   s      r   .test_event_based_hold_bucket_with_no_retentionz<TestRetention.test_event_based_hold_bucket_with_no_retention  s     ""$J""j9"MJ,,Z-7>B - D 	NNK%j1ABC,,Z-7>B - D 	NNK)T*5EFG,,Z-7>C - Er   c                 F   d}| j                  |      }| j                  |d      }| j                  ||d |       | j                  dddt	        |      g       | j                  ||dd        | j                  ddd	t	        |      g       | j                  ||d
|       y )NrA   r   r   )r   r   r   r   r   Tr   Fr   r   s       r   +test_event_based_hold_bucket_with_retentionz9TestRetention.test_event_based_hold_bucket_with_retention  s     556FGJ""j9"MJ,,Z-7>B>N - P 	NNK%j1ABC,,Z-7>B>B - D 	NNK)T*5EFG,,Z-7>C>N - Pr   c           	         | j                         }| j                  |d      }| j                  |d      }| j                  dddt        |      t        |      g       | j	                  ||d       | j	                  ||d       | j                  dddt        |      t        |      g       | j	                  ||d	       | j	                  ||d	       y )
Nr   r   r   r   r   Tr   r   Fr   r   s       r   )test_event_based_hold_multiple_sequentialz7TestRetention.test_event_based_hold_multiple_sequential  s    ""$J##zI#NK##zI#NKNN	gu	k		k		 	,,Z-8>B - D 	,,Z-8>B - D 	NN	gy	k		k		 	,,Z-8>C - E 	,,Z-8>C - Er   c           
         | j                         }| j                  |d      }| j                  |d      }| j                  ddddt        |      t        |      g       | j	                  ||d       | j	                  ||d       | j                  dddd	t        |      t        |      g       | j	                  ||d
       | j	                  ||d
       y )Nr   r   r0   r   r   r   Tr   r   Fr   r   s       r   'test_event_based_hold_multiple_parallelz5TestRetention.test_event_based_hold_multiple_parallel  s
    ""$J##zI#NK##zI#NKNNk7E[[ 
 	,,Z-8>B - D 	,,Z-8>B - D 	NNk7I[[ 
 	,,Z-8>C - E 	,,Z-8>C - Er   c                     | j                         }| j                  dddt        |      g       | j                  |d       | j                  dddt        |      g       | j                  |d       y )Nr   event-defaultr   T!expected_default_event_based_holdr   Fr   r   r   _VerifyDefaultEventBasedHoldr   s     r   test_default_event_based_holdz+TestRetention.test_default_event_based_hold  sx     ""$JNNK%j9IJK%%jHL & NNNK)T*=MNO%%jHM & Or   c           	          | j                         }| j                         }| j                  dddt        |      t        |      g       | j                  |d       | j                  |d       y Nr   r   r   Tr   r   r+   s      r   1test_default_event_based_hold_multiple_sequentialz?TestRetention.test_default_event_based_hold_multiple_sequential  |     ##%K##%KNN_e[[ 
 	%%kHL & N%%kHL & Nr   c           	          | j                         }| j                         }| j                  dddt        |      t        |      g       | j                  |d       | j                  |d       y r   r   r+   s      r   /test_default_event_based_hold_multiple_parallelz=TestRetention.test_default_event_based_hold_multiple_parallel,  r   r   Nc                    | j                   j                  |j                  |j                  g d      }|| j	                  |j
                  d        n| j	                  |j
                  |       || j	                  |j                  d        n| j	                  |j                  |       || j	                  |j                  d        y |du r| j                   j                  |j                  dg      j                  }t        j                  d|j                        }|j                  |z   }	|| j	                  |j                  |	       y | j                  |j                  |	       y y )N)timeCreatedtemporaryHoldeventBasedHoldretentionExpirationTimero   Frn   r   )rv   GetObjectMetadatarx   object_namer   r   r   r   rw   rn   ry   	timedeltaretentionPeriodr   assertGreater)
r   r   r   r   r   r   object_metadataretention_policy
time_deltaexpected_expiration_times
             r   r   z1TestRetention._VerifyObjectHoldAndRetentionStatus;  s[    mm55
 6 O 
44d;
44nE
55t<
557GH
>>E	U	"001G1G9J 9: 1 ;;J?  %%a)9)I)IJj!0!<!<z!I		!@@1	3 	?BB3	5 
#r   c                     | j                   j                  |j                  dg      j                  }|| j	                  |d        y | j	                  ||       y )NdefaultEventBasedHoldro   )rv   rw   rx   r   r   )r   r   r   actual_default_event_based_holds       r   r   z*TestRetention._VerifyDefaultEventBasedHoldf  sb     '+mm&=&='( '> '**?*? $ )0
6=
68:r   c                 d    t         j                   j                  |d      }| j                  |      S )a'  Converts time in following format to its equivalent timestamp in seconds.

      Format: '%a, %d %b %Y %H:%M:%S GMT'
        i.e.: 'Fri, 18 Aug 2017 23:31:39 GMT'

    Args:
      time_string: time in string format.

    Returns:
      returns equivalent timestamp in seconds of given time.
    z%a, %d %b %Y %H:%M:%S GMT)ry   strptimer   )r   time_stringconverted_times      r   r   z)TestRetention._ConvertTimeStringToSecondss  s1     &&//0KMN!!.11r   )NNN)N),__name__
__module____qualname____doc__r   r   r   r   r#   r)   r.   r1   r6   r:   r>   rI   rP   rT   rW   rZ   r_   ra   rc   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r
   r
   "   s   09:78H 9 ;H 8967J 8 :J 8967L 8 :L 8967K 8 :K 8967L 8 :L 8967L 8 :L 8967L 8 :L 8967J 8 :J 8967J 8 :J 8967F 8 :F 8967! 8 :! 8967J 8 :J 8967
J 8 :
J 8967A 8 :A 8967M 8 :M 8967
! 8 :
! 8967. 8 :. 8967	L 8 :	L 8967E 8 :E6 8967E 8 :E: 8967: 8 :: 8967B 8 :B 8967M 8 :M 8967C 8 :C 8967P 8 :P& 8967C 8 :C2 8967C 8 :C6 8967N 8 :N 8967E 8 :E 8967P 8 :P& 8967E 8 :E2 8967E 8 :E6 8967O 8 :O 8967N 8 :N 8967N 8 :N  :>;?;?)5Z FJ:2r   r
   )r   
__future__r   ry   r{   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   r   gslib.tests.utilr   r   r   _DAYS_IN_MONTHr"   _DAYS_IN_YEARintr(   GsUtilIntegrationTestCaser
   r   r   r   <module>r      s`    / &  	 ' ' ? @ 0"_4 }67 _	2H66 _	2r   