
    S                         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r " S S5      rS rS rS rS rS rS rS r SS jrS r g)z*Utils for compute instances bulk commands.    )absolute_import)division)unicode_literals)encoding)instance_utils)utils)InvalidArgumentException)resource_manager_tags_utils)secure_tags_utils)util)	arg_utilsNc                       \ rS rSrSrS rSrg)SupportedFeatures    z>Simple dataclass to hold status of supported features in Bulk.c                     X l         Xl        X0l        X@l        XPl        X`l        Xpl        Xl        SU l        Xl	        Xl
        Xl        Xl        UU l        Xl        g )NT)support_secure_tagssupport_display_devicesupport_numa_node_countsupport_snp_svsmsupport_max_count_per_zonesupport_custom_hostnames support_specific_then_x_affinitysupport_watchdog_timersupport_replica_zonessupport_graceful_shutdownsupport_source_snapshot_regionsupport_skip_guest_os_shutdown"support_preemption_notice_duration#support_instance_flexibility_policy support_workload_identity_config)selfr   r   r   r   r   r   r   r   r   r   r   r   r   r    s                  =lib/googlecloudsdk/command_lib/compute/instances/bulk/util.py__init__SupportedFeatures.__init__#   sh    "  3"8#: ,&@#$<!,L)"8!%D%>"*H'*H'.P++ 	, -M)    )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    N)__name__
__module____qualname____firstlineno____doc__r#   __static_attributes__ r%   r"   r   r       s    F!Mr%   r   c                 r    U R                  S5      (       d  gUR                  X5      nUR                  5       $ )z4Get sourceInstanceTemplate value as required by API.source_instance_templateN)IsSpecifiedResolveAsResourceSelfLink)args	resourcesinstance_template_resourcerefs       r"   _GetSourceInstanceTemplater6   G   s3    			4	5	5"44TE#	r%   c                    U R                  S5      (       d-  U R                  S5      (       d  U R                  S5      (       d  gUR                  5       nU R                  S5      (       d  U R                  S5      (       a(  U(       a  [        X5      Ul        O[	        X5      Ul        U R                  S5      (       a:  [
        R                  " U R                  UR                  R                  5      Ul	        U$ )z,Get locationPolicy value as required by API.location_policymax_count_per_zonetarget_distribution_shapeN)
IsKnownAndSpecifiedLocationPolicy8_GetLocationPolicyLocationsMaxCountPerZoneFeatureEnabled	locations9_GetLocationPolicyLocationsMaxCountPerZoneFeatureDisabledr   ChoiceToEnumr:   TargetShapeValueValuesEnumtargetShape)r2   messagesmax_count_per_zone_enabledr8   s       r"   _GetLocationPolicyrE   O   s     011		!	!"6	7	7&&'BCC++-/	/00D4L4L5 5 "
B  D  
9::"+"8"8&&::#O 
r%   c           
      p   / nU R                   R                  5        H~  u  p4[        R                  " XAR                  R
                  5      nUR                  UR                  R                  R                  SR                  U5      UR	                  US9S95        M     UR                  R                  US9$ )9Helper function for getting location for location policy.zones/{}
preferencekeyvalueadditionalProperties)r8   itemsr   r@   LocationPolicyLocationPreferenceValueValuesEnumappendr<   LocationsValueAdditionalPropertyformat)r2   rC   r>   zonepolicyzone_policys         r"   r?   r?   q   s    )**002ld((//IIK ..AA!!$'11[1I 	B 	
	 3 
	 	 	/	/Y	/	OOr%   c                    / nU R                   (       Ga3  U R                   R                  5        GH  u  p4[        R                  " XAR                  R
                  5      nU R                  (       a  X0R                  ;   au  UR                  UR                  R                  R                  SR                  U5      UR	                  UUR                  [        U R                  U   5      S9S9S95        M  UR                  UR                  R                  R                  SR                  U5      UR	                  US9S95        GM     [        R                  " SUR                  R
                  5      nU R                  (       a  U R                  R                  5        H  u  p7U R                   (       a  X0R                   ;  d  U R                   (       a  M8  UR                  UR                  R                  R                  SR                  U5      UR	                  UUR                  [        U5      S9S9S95        M     UR                  R                  US9$ )rG   rH   )maxCount)rJ   constraintsrK   rI   allowrN   )r8   rP   r   r@   rQ   rR   r9   rS   r<   rT   rU   rV   !LocationPolicyLocationConstraintsint)r2   rC   r>   rW   rX   rY   zone_policy_allowed_preferencecounts           r"   r=   r=      s   )	,,224**
11KKk 
	 	 T-D-D%D##22EE%%d+55* ( J J!$T%<%<T%B!C !K ! 6  F 
	
 	##22EE%%d+555M F 	
# 50 $-#9#9x..HH$  
..446


4/C/C#C"""##22EE%%d+55= ( J J!$U !K ! 6  F 
	
	 7  
	 	 	/	/Y	/	OOr%   c                    0 nU(       a"  U R                  S5      (       a  U R                  n0 nU H/  nXd;   a  UR                  XF   S9XV'   M  UR                  5       XV'   M1     [        R                  " UUR
                  R                  5      $ )z4Helper function for getting per_instance_properties.per_instance_hostnames)hostname)r/   rc   /BulkInsertInstanceResourcePerInstancePropertiesr   DictToAdditionalPropertyMessageBulkInsertInstanceResourcePerInstancePropertiesValue)r2   rC   instance_namesr   rc   per_instance_propertiesnames          r"   _GetPerInstancePropertiesrl      s     $"2"23K"L"L!88d%

B
B-3 C  # 
B
B
D #  
	1	1))DD
 r%   c                 B    [         R                  " XR                  5      $ )z=Converts a Python dict to a Compute API AttachedDisk message.)r   DictToMessageAttachedDisk)	disk_dictrC   s     r"   _DictToAttachedDiskMessagerq      s    				+@+@	AAr%   c                    / nU R                  S5      (       a  [        UUSU R                  S5        OU R                  S5      (       a{  U R                   Hk  nUS   nUS   nSnSU;   a  US   n[	        U5      n/ nSU;   a'  US    H  n UR                  [        X5      5        M      [        UUUUUU(       a  UOSS9  Mm     U(       d  gUR                  R                  US9$ ! [         a  n	[        SS	U S
U	 SU 35      eSn	A	ff = f)zFCreates an InstanceFlexibilityPolicy message from the given arguments. instance_selection_machine_typeszdefault-selectionNinstance_selectionrk   zmachine-typerankdiskz+Invalid disk format in instance selection "z": z - Received: )	api_disksrN   )
r/   _AddInstanceSelectionrs   rt   r_   rS   rq   r	   InstanceFlexibilityPolicyInstanceSelectionsValue)
r2   rC   instance_selectionsrt   rk   machine_typesru   rw   rp   es
             r"    _CreateInstanceFlexibilityPolicyr~      sP   	899-- ,--"55'd(8md	%	%!&)4yi	%	%+F3I7	LM 4 




!*I% 64 
		+	+	C	C. 
D 
 ! * *$=dV3qc J'[* s   C%%
D	/DD	c                    U Ha  nUR                   U:X  d  M  UR                  b  [        SS5      eUR                  U R                  R
                  R                  USS95        Mc     U R                  US9nUb  XGl        U(       a  XWl	        UR                  U R                  R
                  R                  UUS95        g)z4Adds instance selection to instance selections list.Nrt   z?Attempt to add multiple instance selections with the same name.rK   )machineTypes)rL   rM   r	   removery   rz   rU   *InstanceFlexibilityPolicyInstanceSelectionru   disksrS   )rC   r{   instance_selection_namer|   ru   rw   rt   instance_selection_payloads           r"   rx   rx     s     0!88		!	!	-& M
 	
   

,
,
D
D
W
W) X  0 99$ :  
 
&*#'0$((@@SS%* T r%   c	                    U R                   n	U R                  =(       d    / n
U R                  =(       d    [        U
5      n[	        U UR
                  U
UR                  5      n[        U UR
                  UR                  5      nUnU R                  S5      (       a  U R                  n[        XU5      nUSLn[        R                  " U UUSSSSUR                  UR                  UR                   S9
n[        R"                  " X5      n[        R$                  " XSS9n[        R&                  " XU5      n[(        R*                  " U UUUUUUUS9n[        R,                  " U R.                  =(       d    / U R0                  =(       d    / -   5      (       + n[(        R2                  " XUXC5      n[(        R4                  " UR
                  U S9n[(        R6                  " UR
                  U SSUR8                  S	9n[        R:                  " U S5      n[(        R<                  " XUU5      n[        R>                  " U 5      n/ n[(        R@                  " U SUS
9(       a  U R.                  =(       d    /  H  nSUS'   M
     [(        RB                  " S-0 SU _SU_SU_SU_SU_SU_SU_SU_SU_SU_SS_SURD                  _SS_SS_SS_SS_SS_SURF                  _6nSn[        RH                  " U U5      (       a  [        RJ                  " U U5      n[        RL                  " U U5      n [(        RN                  " XS9n!Sn"U RP                  c  U RR                  ct  URT                  (       a  U RV                  cV  U RX                  cI  U RZ                  c<  U R\                  (       d+  UR^                  (       a  U R`                  c  U Rb                  b  U RX                  n#[        Rd                  " UR
                  U RP                  U RR                  URT                  (       a  U RV                  OSU#U RZ                  U R\                  UR^                  (       a  U R`                  OSU Rb                  5	      n"/ n$[g        U S S5      n%U%(       a@  U% H:  n&[h        Rj                  " UU&UUUS!9n'U$Rm                  U'Ro                  5       5        M<     Sn(URp                  (       a9  U R                  S"5      (       a#  UR
                  Rs                  U Rt                  S#9n([        Rv                  " XURx                  5      n)[        Rz                  " U UR
                  UR|                  5      n*UR
                  R                  U U R                  UU!UUUU R                  UUUUU$UU)U"S$9n+UR|                  (       a  U*(       a  U*U+lB        UR                  (       a6  U R                  (       a%  [        R                  " U R                  5      U+lG        U R                  (       a  [        R                  " U R                  5      n,U,bu  UR
                  R~                  n-U-R                  [        [        R                  " U,5      5       V.V/s/ s H   u  n.n/U-R                  R                  U.U/S%9PM"     sn/n.S&9U+lP        URp                  (       a  U((       a  U(U+lQ        U(       a  UU+lR        U R                  S'5      (       a  U R                  U+lT        U R                  S(5      (       aD  [        R                  " U R                  UR
                  R                  R                  5      U+lZ        U R                  S)5      (       a  [        R                  " X5      U+l\        UU+UUUU	US*.n0UR                  (       a:  [        XR
                  5      n1U1(       a  UR
                  R                  U1S+9n2U2U0S,'   UR
                  R                  " S-0 U0D6$ s  sn/n.f ).z"Create bulkInsertInstanceResource.	min_countNFT)support_node_affinitysupport_min_node_cpusupport_max_run_duration"support_local_ssd_recovery_timeoutr   r   r   )instance_properties)r2   resource_parsercompute_clientholderprojectlocationscopeskip_defaults)rC   r2   )rC   r2   !support_confidential_compute_type%support_confidential_compute_type_tdxr   )r2   support_disksr   romoder2   r   r   r   r   r   	image_urir   create_boot_diskboot_disk_size_gbsupport_kmsr   support_nvdimmsupport_boot_snapshot_urisupport_image_cseksupport_create_disk_snapshotsuse_disk_type_urir   )r2   r   resource_policies)r   r   r   enable_display_device)enableDisplay)canIpForwarddescriptionr   guestAcceleratorslabelsmachineTypemetadataminCpuPlatformnetworkInterfacesserviceAccounts
schedulingtagsresourcePoliciesshieldedInstanceConfigreservationAffinityadvancedMachineFeaturesrK   rN   erase_windows_vss_signaturepost_key_revocation_action_typenetwork_performance_configs)ra   instancePropertiesminCountperInstancePropertiessourceInstanceTemplatenamePatternlocationPolicy)instanceSelectionsinstanceFlexibilityPolicyr,   )aname_patternpredefined_namesra   lenrl   rC   r   rE   r   r/   r   r6   r   GetSchedulingr   r   r   GetTags	GetLabelsGetMetadatacreate_utilsGetBulkNetworkInterfacesUseExistingBootDiskrv   create_diskGetImageUri"BuildShieldedInstanceConfigMessage&BuildConfidentialInstanceConfigMessager   GetConfidentialVmTypeGetProjectServiceAccountGetBootDiskSizeGbCheckSpecifiedDiskArgsCreateDiskMessagesr   r   CheckSpecifiedMachineTypeArgsCreateMachineTypeNameGetCanIpForward$GetAcceleratorsForInstancePropertiesenable_nested_virtualizationthreads_per_corer   numa_node_countvisible_core_countenable_uefi_networkingperformance_monitoring_unitr   enable_watchdog_timer
turbo_mode$CreateAdvancedMachineFeaturesMessagegetattrmaintenance_utilParseResourcePolicyWithScoperS   Namer   DisplayDevicer   GetReservationAffinityr   #CreateWorkloadIdentityConfigMessager    InstancePropertiesr   min_cpu_platformworkloadIdentityConfigr   secure_tagsr   GetSecureTags
secureTagsresource_manager_tagsr
   GetResourceManagerTagsResourceManagerTagsValuesortedsix	iteritemsrU   resourceManagerTagsdisplayDeviceconfidentialInstanceConfigr   eraseWindowsVssSignaturer   r@   r   Instance*PostKeyRevocationActionTypeValueValuesEnumpostKeyRevocationActionTypeGetNetworkPerformanceConfignetworkPerformanceConfigr   r~   ry   rg   )3r2   r   r   r   r   r   r   r4   supported_featuresr   ri   instance_countper_instance_propsr8   instance_min_countr.   r   r   r   r   r   network_interfacesr   r   shielded_instance_configconfidential_instance_configconfidential_vm_typeservice_accountsr   r   rv   machine_type_namecan_ip_forwardguest_acceleratorsadvanced_machine_featuresr   parsed_resource_policiesr   rX   resource_policy_refdisplay_devicereservation_affinityworkload_identity_configr   ret_resource_manager_tagsproperties_messagerL   rM   kwargsinstance_selections_valueinstance_flexibility_policy_objs3                                                      r"    CreateBulkInsertInstanceResourcer  +  s   $ "",((.B.::4^!4.0
11	 '
33/ &	k""7
7 +$6-++
!#)- 2 L L

;
; 
?
?*  
			5$##
& ''mL(#<<%#!	 ((99?t//52
6
 &&
,g) *LL&&T
 99!**,004->>  (==dDI!::
^] %66t<
%((uM
 		Rd6l  ++   	
 & (   * ,  1FF  #'    '+!"  #$ (:'X'X%E* 11$FF&<<" "11$F.#HH #
''3				*

4
4"".

!
!
-		$	$	0

*
*

3
3((4
//
%00;;##--!!!99   '',,!88 &&OO	
 $  d$7>#,II

 %%&9&>&>&@A $ ...43C3C4 4 $,,::00 ; N (>>
.OO ,OO
99 '//BB!""*#***&/5.7! C & 99
"1I.++0@0@%6%D%D&" 
#::&&	
 
 !,)22EE0B0[0[
 !'s}}5N'O P	  !Q*#u !99LL M  !Q	  1\ 1- ..>(6%!$ 2 
344(( 0 
7886?6L6L,,((SS73
 
344224H 0
 /$1 8!'& ;; @%%! !

!
!
;
;!: <  &
 -Lf()		 	 	;	;	Ef	EEm s   /'_1
)N)!r*   
__future__r   r   r   apitools.base.pyr   googlecloudsdk.api_lib.computer   /googlecloudsdk.api_lib.compute.instances.creater   r   "googlecloudsdk.calliope.exceptionsr	   "googlecloudsdk.command_lib.computer
   r   4googlecloudsdk.command_lib.compute.resource_policiesr   r   $googlecloudsdk.command_lib.util.apisr   r   r   r6   rE   r?   r=   rl   rq   r~   rx   r  r,   r%   r"   <module>r     sv    1 &  ' % 9 Q G J @ Y : 
$M $MNDP"2Pj6B
*f $NqFr%   