
    u=                         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rS rS rS rS r SS jrS r    SS jr     SS jrS rS rS rS rS rS rS r S r!g
)zCCommon utility functions to construct compute reservations message.    )absolute_import)division)unicode_literals)
exceptions)flags)scope)util)timesNc                    [        U [        USS5      5      n[        U [        USS5      5      n[        X[        USS5      5      nUR	                  S5      (       a  [        X5      OSn[        U UR                  UUUR                  UR                  [        USS5      [        USS5      [        USS5      U5
      n[        X[        US	S5      U5      n	Sn
UR	                  S
5      (       a  [        US
S5      n
[        U UR                  5       UUU	UR                  UR                  [        USS5      [        USS5      [        USS5      [        USS5      U
5      $ )z2Construct reservation message from args passed in.acceleratorN	local_ssdshare_settingsource_instance_templatelocation_hintmaintenance_freeze_durationmaintenance_intervalresource_policiesscheduling_typedelete_at_timedelete_after_durationreservation_sharing_policyenable_emergent_maintenance)MakeGuestAcceleratorsgetattrMakeLocalSsdsMakeShareSettingsWithArgsIsKnownAndSpecifiedResolveSourceInstanceTemplate!MakeSpecificSKUReservationMessagevm_countmachine_typemin_cpu_platformMakeResourcePoliciesMakeReservationMessageNamerequire_specific_reservationzone)messagesargsreservation_ref	resourcesaccelerators
local_ssdsshare_settingssource_instance_template_refspecific_reservationr   r   s              ;lib/googlecloudsdk/command_lib/compute/reservations/util.pyMakeReservationMessageFromArgsr2      s{   &x'.t]D'IK,Xwt[$'GH*,gdOT:<. 
	!	!"<	=	= $D4 
 ;
mm

dOT*d148d*D1" +/BD!I /	/00d$5t<O	
''d$d+d+T2d0$7d148
     c                     [         R                  " SS[         R                  R                  SSS9R	                  X[
        R                  R                  S9$ )Nz--source-instance-templatezinstance templatezcompute.instanceTemplateszcompute.regionInstanceTemplates)resource_namescope_flags_usageglobal_collectionregional_collection)default_scope)compute_flagsResourceArgumentScopeFlagsUsageDONT_USE_SCOPE_FLAGSResolveAsResourcecompute_scope	ScopeEnumGLOBAL)r)   r+   s     r1   r   r   M   sS    		'	'"'%55JJ3;
 
]%<%<%C%C  r3   c                 t    Uc  / $ / nU H*  nU R                  US   US   S9nUR                  U5        M,     U$ )z4Constructs the repeated accelerator message objects.counttype)acceleratorCountacceleratorType)AcceleratorConfigappend)r(   accelerator_configsr,   ams        r1   r   r   Y   sU     I,a""7QvY 	# 	@A 
 
r3   c                    Uc  / $ / nU R                   nUR                  nU H  nUS   R                  5       S:X  a  UR                  nO;US   R                  5       S:X  a  UR                  nO[
        R                  " SS5      eU" US   US9nUR                  SS	5      nUS	:  a  [
        R                  " SS
5      eUR                  U/U-  5        M     U$ )z2Constructs the repeated local_ssd message objects.	interfaceNVMESCSIz--local-ssdzNMust specify a valid interface (NVME, SCSI) for SSDs attached to the instance.size)
diskSizeGbrM   rC      zGMust specify a valid count (>= 1) for SSDs attached to the reservation.)	FAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDiskInterfaceValueValuesEnumupperrN   rO   r   InvalidArgumentExceptiongetextend)	r(   ssd_configsr-   disk_msginterface_msgsrM   rK   
partitionss	            r1   r   r   h   s    I*MM  33-a~'$$i	
;			6	)$$i//
 
 	AfI;Aw"JA~//
 
 qcJ&'' * 
r3   c                    U(       Ga  US:X  a-  U R                  U R                   R                  R                  S9$ US:X  a`  UR                  U5      (       a  US:w  a  [        R
                  " SS5      eU R                  U R                   R                  R                  S9$ US:X  ay  UR                  U5      (       d  [        R
                  " SS5      eS	nUS:w  a  [        U [        XS	5      5      nU R                  U R                   R                  R                  US
9$ US:X  ao  UR                  U5      (       d  [        R
                  " SS5      eU R                  U R                   R                  R                  [        U [        XS	5      5      S9$ g	UR                  U5      (       a  [        R
                  " SS5      eg	)zDConstructs the share settings message object from raw args as input.organization	shareTypelocalremove_share_with--share_with_The scope this reservation is to be shared with must not be specified with share setting local.projectsEThe projects this reservation is to be shared with must be specified.Nra   
projectMapfoldersDThe folders this reservation is to be shared with must be specified.ra   	folderMap--share_setting6Please specify share setting if specifying share with.)ShareSettingsShareTypeValueValuesEnumORGANIZATIONIsSpecifiedr   rV   LOCALMakeProjectMapFromProjectListr   SPECIFIC_PROJECTS&DIRECT_PROJECTS_UNDER_SPECIFIC_FOLDERSMakeFolderMapFromFolderListr   )r(   r)   setting_configs
share_withproject_maps        r1   r   r      s   
 .(##h.D.D%=%=ll $ L L'!			*	%	%*8K*K1123 	3 ##**CCII $ K K*$j))11 	 k	*	*3gd57##**CC  $ " " )#j))11 	 ##**CC11/078<1>? $ @ @ $ 
++//

BD D r3   c           
      n   U(       Ga  US:X  a-  U R                  U R                   R                  R                  S9$ US:X  aX  SUR                  5       ;   a  [        R
                  " SS5      eU R                  U R                   R                  R                  S9$ US:X  ar  SUR                  5       ;  a  [        R
                  " SS5      eU R                  U R                   R                  R                  [        XR                  SS	5      5      S
9$ US:X  ar  SUR                  5       ;  a  [        R
                  " SS5      eU R                  U R                   R                  R                  [        XR                  SS	5      5      S9$ g	SUR                  5       ;   a  [        R
                  " SS5      eg	)zKConstructs the share settings message object from dictionary form of input.r_   r`   rb   rz   rd   re   rf   rg   Nrh   rj   rk   rl   rn   ro   )rp   rq   rr   keysr   rV   rt   rv   ru   rW   rw   rx   )r(   
dictionaryry   s      r1   MakeShareSettingsWithDictr      s   .(##h.D.D%=%=ll $ L L'!	*	*1123 	3 ##**CCII $ K K*$	Z__.	.11 	 ##**CC2|T:< $ = =
 )#	Z__.	.11 	 ##**CC11/|T:< $ = = $ z((//

BD D r3   c
                     U R                   n
U	(       a  U R                  UU	R                  5       SS9$ U
" UUUUS9nU(       a
  US-  Ul        U(       a   U R                   R	                  U5      Ul        U(       a  Xkl        U R                  XS9$ )z<Constructs a single specific sku reservation message object.N)rC   sourceInstanceTemplateinstanceProperties)guestAccelerators	localSsdsmachineTypeminCpuPlatformi  )rC   r   )9AllocationSpecificSKUAllocationReservedInstanceProperties AllocationSpecificSKUReservationSelfLinkmaintenanceFreezeDurationHours"MaintenanceIntervalValueValuesEnummaintenanceIntervallocationHint)r(   r    r,   r-   r!   r"   r   freeze_durationfreeze_intervalr/   	prop_msgsinstance_propertiess               r1   r   r      s     HH !44;DDF 5   $& '	)
 ;Jd;R8

L
L--o> - )6&44 5 @ @r3   c                 >   U R                  UUUUS9nU(       a  X,l        U(       a  XLl        U(       a  [        R                  " U5      Ul        U(       a  U R                  US9Ul        U	(       a  [        X	5      Ul	        U
b  Xl
        Ub  [        X5      Ul        U$ )z0Constructs a single reservations message object.)namespecificReservationspecificReservationRequiredr'   )seconds)ReservationshareSettingsresourcePoliciesr
   FormatDateTimedeleteAtTimeDurationdeleteAfterDuration#MakeReservationSharingPolicyMessagereservationSharingPolicyenableEmergentMaintenanceMakeSchedulingTypeschedulingType)r(   reservation_namer.   r0   r   r&   reservation_zoner   r   r   r   r   reservation_messages                r1   r$   r$     s     !,,.">	 - 
 (6%+<(',';';N'K$.6.?.?% /@ /+  +	
 0 !,4O1 85 & 
r3   c                     US:X  a-  U R                  U R                   R                  R                  S9$ US:X  a-  U R                  U R                   R                  R                  S9$ g )NDISALLOW_ALL)serviceShareType	ALLOW_ALL)"AllocationReservationSharingPolicyServiceShareTypeValueValuesEnumr   r   )r(   r   s     r1   r   r   C  ss    >166!DDddqq 7   "[066!DDddnn 7   r3   c           
          / nU HC  nUR                  U R                  R                  R                  UU R	                  US9S95        ME     U R                  R                  US9$ )N)	projectIdkeyvalueadditionalProperties)rH   rp   ProjectMapValueAdditionalPropertyShareSettingsProjectConfig)r(   rf   additional_propertiesprojects       r1   ru   ru   P  sy    g  ..AA555H 	B 	JK 
 
			/	/0 
0 
2 2r3   c           
          / nU HC  nUR                  U R                  R                  R                  UU R	                  US9S95        ME     U R                  R                  US9$ )N)folderIdr   r   )rH   rp   FolderMapValuer   ShareSettingsFolderConfig)r(   rj   r   folders       r1   rx   rx   [  sy    f  --@@44f4E 	A 	GH 
 
			.	.0 
/ 
2 2r3   c                    Uc  gU R                   R                  [        [        R                  " U5      5       VVs/ s H3  u  pEU R                   R                  R                  U[        X5U5      S9PM5     snnS9$ s  snnf )z1Constructs the resource policies message objects.Nr   r   )r   ResourcePoliciesValuesortedsix	iteritemsr   MakeUrl)r(   r*   resource_policy_dictionaryr+   r   r   s         r1   r#   r#   f  s      '				3	3 s}}-GHIJ J*# 00CC?C D EIJ	3 
  Js   :A<
c                     US:X  a   U R                   R                  R                  $ US:X  a   U R                   R                  R                  $ US:X  a   U R                   R                  R                  $ g)zAConstructs the maintenance scope message object for reservations.allunusedrunningN)%ReservationsPerformMaintenanceRequestMaintenanceScopeValueValuesEnumALLUNUSED_CAPACITYRUNNING_VMSr(   maintenance_scopes     r1    MakeReservationsMaintenanceScoper   s  sq    %66VVZZ H$66VVff I%66VVbb r3   c                     US:X  a   U R                   R                  R                  $ US:X  a   U R                   R                  R                  $ US:X  a   U R                   R                  R                  $ g)zGConstructs the maintenance scope message object for reservation blocks.r   r   r   N)+ReservationsBlocksPerformMaintenanceRequestr   r   r   r   r   s     r1   %MakeReservationBlocksMaintenanceScoper     sq    %<<\\`` H$<<\\ll I%<<\\hh r3   c                     U(       aL  US:X  a   U R                   R                  R                  $ US:X  a   U R                   R                  R                  $ g)z*Constructs the scheduling type enum value.GROUPEDINDEPENDENTN)r   SchedulingTypeValueValuesEnumr   r   )r(   r   s     r1   r   r     sH    )#!!??GGG-'!!??KKK	r3   c                 t    [         R                  " U UUR                  UR                  S9R	                  5       $ )N)r   r'   )maintenance_utilParseResourcePolicyWithZoner   r'   r   )r+   r   r*   s      r1   r   r     s6    		5	5%%	
! "*	,r3   )rz   )NNNN)NNNNN)"__doc__
__future__r   r   r   googlecloudsdk.callioper   "googlecloudsdk.command_lib.computer   r:   r   r?   4googlecloudsdk.command_lib.compute.resource_policiesr	   r   googlecloudsdk.core.utilr
   r   r2   r   r   r   r   r   r   r$   r   ru   rx   r#   r   r   r   r    r3   r1   <module>r      s    J &  ' . E E Y * 
-`	J *60f)f !%$@^ # $0f
22
$$,r3   