
    u=                         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Zd Zd Zd Zd Z	 ddZd Z	 	 	 	 ddZ	 	 	 	 	 ddZd Zd Zd Zd Zd Zd Zd Z d Z!y
)zCCommon utility functions to construct compute reservations message.    )absolute_import)division)unicode_literals)
exceptions)flags)scope)util)timesNc                    t        | t        |dd            }t        | t        |dd            }t        | |t        |dd            }|j	                  d      rt        ||      nd}t        | |j                  |||j                  |j                  t        |dd      t        |dd      t        |dd      |
      }t        | |t        |d	d      |      }	d}
|j	                  d
      rt        |d
d      }
t        | |j                         |||	|j                  |j                  t        |dd      t        |dd      t        |dd      t        |dd      |
      S )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d$5t<O	
''d$d+d+T2d0$7d148
     c                     t        j                  ddt         j                  j                  dd      j	                  | |t
        j                  j                        S )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   sU    		'	'"'%55JJ3;
 
I]%<%<%C%C  r3   c                 t    |g S g }|D ],  }| j                  |d   |d         }|j                  |       . |S )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                    |g S g }| j                   }|j                  }|D ]  }|d   j                         dk(  r|j                  }n9|d   j                         dk(  r|j                  }nt        j                  dd       ||d   |      }|j                  dd	      }|d	k  rt        j                  dd
      |j                  |g|z          |S )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                 `   |r|dk(  r0| j                  | j                   j                  j                        S |dk(  r\|j                  |      r|dk7  rt	        j
                  dd      | j                  | j                   j                  j                        S |dk(  rv|j                  |      st	        j
                  dd      d	}|dk7  rt        | t        ||d	            }| j                  | j                   j                  j                  |
      S |dk(  rm|j                  |      st	        j
                  dd      | j                  | j                   j                  j                  t        | t        ||d	                  S y	|j                  |      rt	        j
                  dd      y	)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gdJ57##**CC  $ " " )#j)11 	 ##**CC11/07j8<1>? $ @ @ $ 
+//

BD D r3   c           
      `   |r|dk(  r0| j                  | j                   j                  j                        S |dk(  rXd|j                         v rt	        j
                  dd      | j                  | j                   j                  j                        S |dk(  rsd|j                         vrt	        j
                  dd      | j                  | j                   j                  j                  t        | |j                  dd	            
      S |dk(  rsd|j                         vrt	        j
                  dd      | j                  | j                   j                  j                  t        | |j                  dd	                  S y	d|j                         v rt	        j
                  dd      y	)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
                    | j                   }
|	r"| j                  ||	j                         d      S  |
||||      }|r
|dz  |_        |r | j                   j	                  |      |_        |r||_        | j                  ||      S )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                    | j                  ||||      }|r||_        |r||_        |rt        j                  |      |_        |r| j                  |      |_        |	rt        | |	      |_	        |
|
|_
        |t        | |      |_        |S )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	
 0 !,4O1 8_5 & 
r3   c                     |dk(  r0| j                  | j                   j                  j                        S |dk(  r0| j                  | j                   j                  j                        S y )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           	          g }|D ]H  }|j                  | j                  j                  j                  || j	                  |                   J | j                  j                  |      S )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           	          g }|D ]H  }|j                  | j                  j                  j                  || j	                  |                   J | j                  j                  |      S )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                 
   |y| j                   j                  t        t        j                  |            D cg c]7  \  }}| j                   j                  j                  |t        |||            9 c}}      S c c}}w )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*#u 00CCE?C D EIJ	3 
  Js   <A?
c                     |dk(  r | j                   j                  j                  S |dk(  r | j                   j                  j                  S |dk(  r | j                   j                  j                  S y)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                     |dk(  r | j                   j                  j                  S |dk(  r | j                   j                  j                  S |dk(  r | j                   j                  j                  S y)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                     |rJ|dk(  r | j                   j                  j                  S |dk(  r | j                   j                  j                  S y)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                 x    t        j                  | ||j                  |j                        j	                         S )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   