
    D                     .   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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  \R,                  rS rS rS rS rS r S!S jrS rS rS r S r!S r"S r#  S"S jr$S r%S r&S#S jr'S r(S  r)g)$z>Utility functions for Google Compute Engine resource policies.    )absolute_import)division)unicode_literals)utils)arg_parsers)base)
exceptions)scope)flags)labels_util)yaml)timesc                 j    [         R                  " X[        5      n[        U 5      nUR                  U4$ )a7  Converts the dt and day to _API_TIMEZONE and returns API formatted values.

Args:
  start_time: The datetime object which represents a start time.
  weekday: The times.Weekday value which corresponds to the weekday.

Returns:
  The weekday and start_time pair formatted as strings for use by the API
  clients.
)r   GetWeekdayInTimezone_API_TIMEZONE_FormatStartTimename)
start_timeweekdayformatted_times      @lib/googlecloudsdk/command_lib/compute/resource_policies/util.py_ParseWeeklyDayAndTimer   "   s/     &&zMJ'#J/.	~	%%    c                 :    [         R                  " U S[        5      $ )Nz%H:%M)r   FormatDateTimer   )dts    r   r   r   2   s    			b'=	99r   c                    UR                  5       nUR                  S5      (       a#  [        X5      u  pEnUR                  US9Ul        OESUR
                  s=::  a  S::  a#  O  O UR                  UR
                  S9nXcl        O[        S5      eUR                  U R                  5       UR                  U R                  US9$ )zBCreates a VM Maintenance Window Resource Policy message from args.daily_cycledailyMaintenanceWindow   d   concurrencyLimitzR--concurrency-limit-percent must be greater or equal to 1 and less or equal to 100r   descriptionregionvmMaintenancePolicy)!ResourcePolicyVmMaintenancePolicyIsSpecified_ParseCycleFrequencyArgs2ResourcePolicyVmMaintenancePolicyMaintenanceWindowmaintenanceWindowconcurrency_limit_percent3ResourcePolicyVmMaintenancePolicyConcurrencyControlconcurrencyControlGroup
ValueErrorResourcePolicyNamer&   r'   )
policy_refargsmessages	vm_policy_r   concurrency_control_groups          r   MakeVmMaintenancePolicyr:   6   s    88:)	m$$0@AAAA!, B .  	D**1c1DD!;; 	E 	=   +D' 5 6 6		 	 ??""#	 
! 
% %r   c                     UR                  5       n[        X5      u  pEnUR                  US9Ul        UR	                  U R                  5       UR                  U R                  US9$ )z9Creates a VM Maintenance window policy message from args.r   r%   )r)   r+   r,   r-   r2   r3   r&   r'   )r4   r5   r6   r7   r8   r   s         r   "MakeVmMaintenanceMaintenanceWindowr<   N   sw    88:).t>!!??* @ ,  
	 	 ??""#	 
! 
% %r   c                     UR                  UR                  S9nUR                  US9nUR                  U R	                  5       UR
                  U R                  US9$ )zDCreates a VM Maintenance concurrency limit policy message from args.r#   )r0   r%   )r/   max_percentr)   r2   r3   r&   r'   )r4   r5   r6   r9   r7   s        r   !MakeVmMaintenanceConcurrentPolicyr?   \   sy     @@)) A   887 9 9) 
	 	 ??""#	 
! 
% %r   c           	      B   [        XSSS9u  pEnSn[        R                  " UUR                  R                  SS9nUR
                  (       a  UR
                  /O/ n	U(       d@  UR                  S5      (       d  U(       d  U	(       a  UR                  UR                  UU	S9nOfUR                  (       a  UR                  OSn
UR                  S5      (       d  U(       d  U	(       d  U
(       a  UR                  UR                  UU	U
S9nUR                  UR                  UR                  [        R                  " U5      R                  UR                  5      S	9UR!                  UUUS
9US9nUR#                  U R%                  5       UR&                  U R(                  US9$ )zCCreates a Disk Snapshot Schedule Resource Policy message from args.Tsupports_hourlysupports_weeklyNsnapshot_labelslabels_destguest_flush)
guestFlushlabelsstorageLocations)rH   rI   rJ   r'   maxRetentionDaysonSourceDiskDeletehourlyScheduledailyScheduleweeklySchedule)retentionPolicyschedulesnapshotProperties)r   r&   r'   snapshotSchedulePolicy)r+   r   ParseCreateArgs6ResourcePolicySnapshotSchedulePolicySnapshotPropertiesLabelsValuestorage_locationr*   rG   snapshot_region$ResourcePolicySnapshotSchedulePolicy3ResourcePolicySnapshotSchedulePolicyRetentionPolicymax_retention_daysr   GetOnSourceDiskDeleteFlagMapperGetEnumForChoiceon_source_disk_delete,ResourcePolicySnapshotSchedulePolicyScheduler2   r3   r&   r'   )r4   r5   r6   support_snapshot_regionhourly_cycler   weekly_cyclesnapshot_propertiesrD   rY   rZ   snapshot_policys               r   MakeDiskSnapshotSchedulePolicyrg   l   s    -E
dD-B),\ //
EE{#	%/
 150E0Ed++,2	 ''?>N

I
I))$/ J 1  /3.B.Bd**O''?>N

I
I))$/$	 J &  AA::22"BB(()C)CD ; F DD%#% E ' - B 
./ 
	 	 ??"",	 
! 
. .r   c                    [        XSSS9u  p4nSu  pgn[        R                  " UUR                  R                  SS9n	U	(       a  UR                  U	S9nUR                  S5      (       a  UR                  nSn
UR                  (       d  UR                  (       aG  UR                  UR                  [        R                  " U5      R                  UR                  5      S	9n
U(       d  U(       d  U(       a  UR                  UUUS
9nSnU(       d  U(       d  U
(       a  UR                  XvU
S9nUR                  U R!                  5       UUS9$ )zcCreates a Disk Snapshot Schedule Resource Policy message from args used in ResourcePolicy.Patch.
  TrA   NNNrD   rE   )rI   r&   NrK   rN   )rS   rT   rR   )r   r&   rU   )r+   r   rV   rW   rX   r*   r&   r]   r`   r\   r   r^   r_   ra   r[   r2   r3   )r4   r5   r6   rc   r   rd   re   snapshot_scheduler&   rD   retention_policyrf   s               r   'MakeDiskSnapshotSchedulePolicyForUpdaterl      sh    -E
dD-B),\ 9I5+//
EE{#	%/
 GG" 	H 	$  
m$$""K
!;!;DD!44$DD **4+E+EF 	E 	H  [L MM#!# N %
 /-1ACC"( D *O 
	 	 ??, 
! 
. .r   c                 (   SnUR                   (       a  UR                  UR                   S9nSnUR                  (       a  UR                  UR                  S9nUR                  UR                  UUS9nUR
                  (       a%  [        R                  " UR
                  5      Ul        UR                  (       a%  [        R                  " UR                  5      Ul
        UR                  U R                  5       UR                  U R                  US9$ )z6Creates an Instance Schedule Policy message from args.NrS   timeZonevmStartSchedulevmStopSchedule)r   r&   r'   instanceSchedulePolicy)vm_start_schedule,ResourcePolicyInstanceSchedulePolicySchedulevm_stop_schedule$ResourcePolicyInstanceSchedulePolicytimezoneinitiation_dater   r   	startTimeend_dateexpirationTimer2   r3   r&   r'   r4   r5   r6   rt   rv   instance_schedule_policys         r   MakeInstanceSchedulePolicyr      s    	 MM'' N ) 	LL&& M ( &JJ}}'% K '
 
).)=)=*& 
]].3.B.B/+ 
	 	 ??""5	 
! 
7 7r   c                    SnUR                   (       a  UR                  UR                   S9nSnUR                  (       a  UR                  UR                  S9nUR                  UR                  UUS9nUR
                  (       a%  [        R                  " UR
                  5      Ul        UR                  (       a%  [        R                  " UR                  5      Ul
        UR                  U R                  5       UR                  US9$ )zACreates an Instance Schedule Policy message from args for update.Nrn   ro   )r   r&   rs   )rt   ru   rv   rw   rx   ry   r   r   rz   r{   r|   r2   r3   r&   r}   s         r   #MakeInstanceSchedulePolicyForUpdater      s    	 MM'' N  	LL&& M  &JJ}}'% K  
).)=)=*& 
]].3.B.B/+ 
	 	 ??""5 
! 
 r   c                 x   SnUR                  S5      (       a  UR                  nSnUR                  S5      (       a/  [        R                  " X#5      R	                  UR
                  5      nUR                  S5      (       a  UR                  OSnSnU[        R                  R                  :X  ab  UR                  S5      (       aL  [        R                  " U5      R	                  UR                  5      nUR                  UR                  UUUS9nOU[        R                  R                  :X  a<  UR                  S5      (       a&  UR                  UR                  UUR                  S9nOU[        R                  R                  [        R                  R                  4;   a<  UR                  S	5      (       a&  UR                  UR                  UUR                   S
9nOUR                  UR                  UUS9nU(       a  Xgl        UR%                  U R'                  5       UR(                  U R*                  US9$ )z<Creates a Group Placement Resource Policy message from args.Navailability_domain_countcollocationgpu_topologyr
   )vmCountavailabilityDomainCountr   r
   tpu_topology)r   r   tpuTopologymax_distance)r   r   maxDistance)r   r   r   )r   r&   r'   groupPlacementPolicy)r*   r   r   GetCollocationFlagMapperr_   r   r   r   ReleaseTrackALPHA$GetAvailabilityDomainScopeFlagMapperr
   "ResourcePolicyGroupPlacementPolicyvm_countr   BETAr   gpuTopologyr2   r3   r&   r'   )	r4   r5   r6   trackr   r   r   placement_policyr
   s	            r   MakeGroupPlacementPolicyr     s   "	122 $ > >+	m$$00))$*:*:; &*&6&6~&F&F""D,
d%%%$*:*:7*C*C66""4::. 
BB 9	 C  !!'''D,<,<^,L,LBB%% C 
 

  	((BB%% C   BB 9 C 
 #/ 		 	 ??""+	 
! 
- -r   c                    UR                  5       nUR                  (       a*  UR                   R                  UR                  5      Ul        UR                  (       a*  UR                   R	                  UR                  5      Ul        UR                  (       a  UR                  Ul        UR                  U R                  5       UR                  U R                  US9$ )z,Creates a Workload Policy message from args.)r   r&   r'   workloadPolicy)ResourcePolicyWorkloadPolicytypeTypeValueValuesEnummax_topology_distance"MaxTopologyDistanceValueValuesEnummaxTopologyDistanceaccelerator_topologyacceleratorTopologyr2   r3   r&   r'   )r4   r5   r6   workload_policys       r   MakeWorkloadPolicyr   D  s    99;/	YY--AA$))L  
*2*O*O*r*r""+O' 
*.*C*CO'		 	 ??""$	 
! 
 r   c                     UR                  5       nUR                  U R                  5       UR                  U R                  US9$ )a/  Creates a Disk Consistency Group Resource Policy message from args.

Args:
  policy_ref: resource reference of the Disk Consistency Group policy.
  args: Namespace, argparse.Namespace.
  messages: message classes.

Returns:
  A messages.ResourcePolicy object for Disk Consistency Group Resource Policy.
)r   r&   r'   diskConsistencyGroupPolicy)(ResourcePolicyDiskConsistencyGroupPolicyr2   r3   r&   r'   )r4   r5   r6   consistency_group_policys       r   MakeDiskConsistencyGroupPolicyr   [  sJ     &NNP		 	 ??""!9	 
! 
; ;r   c                    [        U 5        Su  pEnU R                  (       a#  UR                  S[        U R                  5      S9nU(       a  U R
                  (       a  UR                  R                  n[        R                  R                  U R
                  R                  5       5      n[        U R                  U5      u  pUR                  UR                  U" U	5      U
S9/S9nU R                  S5      (       aC  U R                  (       a  [!        X5      nO&["        R$                  " U R'                  S5      S5      eU(       a>  U R(                  (       a-  UR+                  U R(                  [        U R                  5      S9nXEU4$ )	zGParses args and returns a tuple of DailyCycle and WeeklyCycle messages.ri   r!   )daysInCyclerz   dayrz   
dayOfWeeksweekly_cycle_from_filezFile cannot be empty.)hoursInCyclerz   )_ValidateCycleFrequencyArgsr   ResourcePolicyDailyCycler   r   rd   "ResourcePolicyWeeklyCycleDayOfWeekDayValueValuesEnumr   WeekdayGetupperr   ResourcePolicyWeeklyCycler*   r   _ParseWeeklyCycleFromFiler	   InvalidArgumentExceptionGetFlagrc   ResourcePolicyHourlyCycle)r5   r6   rB   rC   rc   r   rd   day_enumr   r   r   s              r   r+   r+   o  sY   
 d#,<),\	33!1$//!B 4 DK<<OOh!!$"3"3"9"9";<g.tHoc77

5
53-: 6 7D7 	l 011		$	$0@11LL124KM 	M**55&&"4??3 6 5L 
L	00r   c                     U R                  S5      (       a8  U R                  (       d&  [        R                  " U R	                  S5      S5      egg)zValidates cycle frequency args.r   z!cannot request a non-daily cycle.N)r*   r   r	   r   r   )r5   s    r   r   r     sG    	m$$T-=-=

-
-]#%HJ J .>$r   c                    [         R                  " U R                  5      nUR                  R                  n/ nU H  nSU;  d  SU;  a&  [
        R                  " U R                  S5      S5      eUS   R                  5       n [        R                  R                  U5      n[        R                  R!                  US   5      n[#        X5      u  phUR%                  UR                  U" U5      US95        M     UR'                  US9$ ! [         a6    [
        R                  " U R                  S5      SR                  U5      5      ef = f)z@Parses WeeklyCycle message from file contents specified in args.r   rz   r   zQEach JSON/YAML object in the list must have the following keys: [day, startTime].zInvalid value for `day`: [{}].r   r   )r   loadr   r   r   r	   r   r   r   r   r   r   KeyErrorformatr   DatetimeParseUtcTimer   appendr   )	r5   r6   weekly_cycle_dictr   days_of_weekday_and_timer   r   r   s	            r   r   r     sA   ii ; ;<88KK(,'lL K|$C//
,,/
0  u

#
#
%C8!!#&g
 %%22<3LMJ,ZAOC33 	4 	56 ($ 
	+	+|	+	DD  8//
,,/
0
*
1
1#
68 88s   D

A E
Nc                 *    U R                  UUUS.SS9$ )N)projectr'   zcompute.resourcePolicies)
collection)Parse)	resourcesr   r   r'   s       r   ParseResourcePolicyr     s+    	
 , 
 
- -r   c                 F    [         R                  " U5      n[        XX$5      $ N)r   ZoneNameToRegionNamer   )r   r   r   zoner'   s        r   ParseResourcePolicyWithZoner     s    %%d+&	Yg	>>r   c                     U[         R                  R                  :X  a  [        R                  " U5      nO U[         R                  R
                  :X  a  Un[        XUW5      $ r   )compute_scopes	ScopeEnumZONEr   r   REGIONr   )r   r   r   locationr
   r'   s         r   ParseResourcePolicyWithScoper     sN    
n&&+++''1F((///F	Ygv	>>r   )F)FF)NN)*__doc__
__future__r   r   r   googlecloudsdk.api_lib.computer   googlecloudsdk.callioper   r   r	   "googlecloudsdk.command_lib.computer
   r   4googlecloudsdk.command_lib.compute.resource_policiesr   $googlecloudsdk.command_lib.util.argsr   googlecloudsdk.corer   googlecloudsdk.core.utilr   UTCr   r   r   r:   r<   r?   rg   rl   r   r   r   r   r   r+   r   r   r   r   r    r   r   <module>r      s    E &  ' 0 / ( . F F < $ *		& :%0%%" <A-.`+.\7B#L0-f.;, .3-21BJE4-?
?r   