
    D                     (   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ej,                  Zd Zd Zd Zd Zd Z	 d!dZd Zd Zd Z d Z!d Z"d Z#	 	 d"dZ$d Z%d Z&d#dZ'd Z(d  Z)y)$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    t        j                  | |t              }t        |       }|j                  |fS )aE  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   "   s1     &&z7MJ'#J/.	~	%%    c                 8    t        j                  | dt              S )Nz%H:%M)r   FormatDateTimer   )dts    r   r   r   2   s    			b'=	99r   c                    |j                         }|j                  d      r(t        ||      \  }}}|j                  |      |_        nQd|j
                  cxk  rdk  r1n t        d      |j                  |j
                        }||_        nt        d      |j                  | j                         |j                  | j                  |      S )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x@A{AAA!, B .  	D**1c1  5 6 6	 	DD!;; 	E 	=   +Di' 5 6 6		 	 ??""#	 
! 
% %r   c                     |j                         }t        ||      \  }}}|j                  |      |_        |j	                  | j                         |j                  | j                  |      S )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   s{    88:).tX>![!??* @ ,  
	 	 ??""#	 
! 
% %r   c                     |j                  |j                        }|j                  |      }|j                  | j	                         |j
                  | j                  |      S )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                    t        ||dd      \  }}}d}t        j                  ||j                  j                  d      }|j
                  r|j
                  gng }	|s4|j                  d      s|s|	ro|j                  |j                  ||	      }nP|j                  r|j                  nd}
|j                  d      s|s|	s|
r|j                  |j                  ||	|
      }|j                  |j                  |j                  t        j                  |      j                  |j                        	      |j!                  |||
      |      }|j#                  | j%                         |j&                  | j(                  |      S )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
HdD-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                 d   t        ||dd      \  }}}d\  }}}t        j                  ||j                  j                  d      }	|	r|j                  |	      }|j                  d      r|j                  }d}
|j                  s|j                  rI|j                  |j                  t        j                  |      j                  |j                        	      }
|s|s|r|j                  |||
      }d}|s|s|
r|j                  |||
      }|j                  | j!                         ||      S )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      so    -E
HdD-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"7J( D *O 
	 	 ??, 
! 
. .r   c                    d}|j                   r|j                  |j                         }d}|j                  r|j                  |j                        }|j                  |j                  ||      }|j
                  r$t        j                  |j
                        |_        |j                  r$t        j                  |j                        |_
        |j                  | j                         |j                  | j                  |      S )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                    d}|j                   r|j                  |j                         }d}|j                  r|j                  |j                        }|j                  |j                  ||      }|j
                  r$t        j                  |j
                        |_        |j                  r$t        j                  |j                        |_
        |j                  | j                         |j                  |      S )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                 H   d}|j                  d      r|j                  }d}|j                  d      r/t        j                  ||      j	                  |j
                        }|j                  d      r|j                  nd}d}|t        j                  j                  k(  r_|j                  d      rNt        j                  |      j	                  |j                        }|j                  |j                  |||      }n|t        j                  j                  k(  r:|j                  d      r)|j                  |j                  ||j                        }n|t        j                  j                  t        j                  j                  fv r:|j                  d	      r)|j                  |j                  ||j                   
      }n|j                  |j                  ||      }|r||_        |j%                  | j'                         |j(                  | j*                  |      S )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 $ > >+	m$00%))$*:*:; &*&6&6~&F""D,
d%%%$*:*:7*C66""4::. 
BB 9	 C  !!'''D,<,<^,LBB%% C 
 

  	(BB%% C   BB 9 C 
 #/ 		 	 ??""+	 
! 
- -r   c                    |j                         }|j                  r*|j                   j                  |j                        |_        |j                  r*|j                   j	                  |j                        |_        |j                  r|j                  |_        |j                  | j                         |j                  | j                  |      S )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                     |j                         }|j                  | j                         |j                  | j                  |      S )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                    t        |        d\  }}}| j                  r&|j                  dt        | j                              }|r| j
                  r|j                  j                  }t        j                  j                  | j
                  j                               }t        | j                  |      \  }	}
|j                  |j                   ||	      |
      g      }| j                  d      r>| j                  rt!        | |      }n%t#        j$                  | j'                  d      d      |r<| j(                  r0|j+                  | j(                  t        | j                              }|||fS )	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  s^   
 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		$	$0x@11LL124KM 	M**55&&"4??3 6 5L 
{L	00r   c                     | j                  d      r2| j                  s%t        j                  | j	                  d      d      yy)zValidates cycle frequency args.r   z!cannot request a non-daily cycle.N)r*   r   r	   r   r   )r5   s    r   r   r     sD    	m$T-=-=

-
-]#%HJ J .>$r   c                    t        j                  | j                        }|j                  j                  }g }|D ]  }d|vsd|vr%t        j                  | j                  d      d      |d   j                         }	 t        j                  j                  |      }t        j                  j!                  |d         }t#        ||      \  }}|j%                  |j                   ||      |              |j'                  |      S # t        $ r5 t        j                  | j                  d      dj                  |            w xY w)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     sE   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

>ENc                 0    | j                  |||dd      S )N)projectr'   zcompute.resourcePolicies)
collection)Parse)	resourcesr   r   r'   s       r   ParseResourcePolicyr     s+    	
 , 
 
- -r   c                 H    t        j                  |      }t        | |||      S N)r   ZoneNameToRegionNamer   )r   r   r   zoner'   s        r   ParseResourcePolicyWithZoner     s#    %%d+&	Ygv	>>r   c                     |t         j                  j                  k(  rt        j                  |      }n|t         j                  j
                  k(  r|}t        | ||      S r   )compute_scopes	ScopeEnumZONEr   r   REGIONr   )r   r   r   locationr
   r'   s         r   ParseResourcePolicyWithScoper     sP    
n&&+++''1F((///F	Ygv	>>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   