
    Q1                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSK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KrSrSrSrSr " S S\
R6                  5      r " S S\
R6                  5      r " S S\
R6                  5      r " S S\
R6                  5      r " S S\
R6                  5      r  " S S\
R6                  5      r! " S S\
R6                  5      r"S r#S r$S r%S  r&S! r'S" r(S# r)S:S$ jr*S:S% jr+S& r,S' r-S;S( jr.S:S) jr/S* r0S+ r1S, r2S- r3S. r4S/ r5S0 r6S1 r7S2 r8S3 r9S4 r:S5 r;S6 r<S7 r=S8 r>S9 r?g)<zAUtility functions that don't belong in the other utility modules.    )absolute_import)division)unicode_literalsN)	constants)
exceptions)log)
console_io)resource_printeralphabetav1zYou have selected a disk size of under [%sGB]. This may result in poor I/O performance. For more information, see: https://developers.google.com/compute/docs/disks#performance.c                       \ rS rSrSrSrg)InstanceNotReadyError-   zGThe user is attempting to perform an operation on a not-ready instance. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       +lib/googlecloudsdk/api_lib/compute/utils.pyr   r   -   s    Or   r   c                       \ rS rSrSrSrg)InvalidUserError1   z&The user provided an invalid username.r   Nr   r   r   r   r   r   1       .r   r   c                       \ rS rSrSrSrg)MissingDependencyError5   z"An external dependency is missing.r   Nr   r   r   r   r    r    5   s    *r   r    c                       \ rS rSrSrSrg)TimeoutError9   zThe user command timed out.r   Nr   r   r   r   r#   r#   9   s    #r   r#   c                       \ rS rSrSrSrg)WrongInstanceTypeError=   z6The instance type is not appropriate for this command.r   Nr   r   r   r   r&   r&   =   s    >r   r&   c                       \ rS rSrSrSrg)ImageNotFoundErrorA   z&The image resource could not be found.r   Nr   r   r   r   r)   r)   A   r   r   r)   c                       \ rS rSrSrSrg)IncorrectX509FormErrorE   z&The X509 should be in binary DER form.r   Nr   r   r   r   r,   r,   E   r   r   r,   c                 ,    U R                  SS5      S   $ )zDConverts zone name to region name: 'us-central1-a' -> 'us-central1'.-   r   )rsplit)	zone_names    r   ZoneNameToRegionNamer3   I   s    			#q	!!	$$r   c                 ,    U R                  SS5      S   $ )zEConverts a collection to a resource type: 'compute.disks' -> 'disks'..r0   split
collections    r   CollectionToResourceTyper:   N       			#q	!!	$$r   c                 ,    U R                  SS5      S   $ )z>Converts a collection to an api: 'compute.disks' -> 'compute'.r5   r0   r   r6   r8   s    r   _GetApiNameFromCollectionr=   S   r;   r   c                     SU -   $ )z(Coverts a resource type to a collection.zcompute.r   )resource_types    r   GetApiCollectionr@   X   s    	m	##r   c                 b    U (       a'  U R                  S5      (       a  SU [        S5      S -   $ U $ )zDConverts gs:// to http:// if uri begins with gs:// else returns uri.zgs://zhttp://storage.googleapis.com/N)
startswithlen)uris    r   NormalizeGoogleStorageUrirE   ]   s.    S^^G$$+c#g,-.@@@Jr   c                 j    [         R                  " SSU 5      R                  5       R                  5       $ )a  Converts camel case text into output friendly text.

Args:
  string: The string to convert.

Returns:
  The string converted from CamelCase to output friendly text.

Examples:
  'camelCase' -> 'camel case'
  'CamelCase' -> 'camel case'
  'camelTLA' -> 'camel tla'
z([A-Z]+)z \1)resubstriplower)strings    r   CamelCaseToOutputFriendlyrL   e   s)     

FF	+	1	1	3	9	9	;;r   c                    [         R                  " 5       nSnU H  n[        U5      (       d  M  Sn  O   U(       aN  Sn[        R                  " XUS9  U (       a  SR                  XR                  5       5      $  UR                  5       $ SR                  U S9n[        R                  " [        [        U5      5      XRS9  UR                  5       $ )z2Returns a string displaying the items and a title.FTyamloutz{}
{}z*list[title="{title}",always-display-title])title)	ioStringIOShouldUseYamlr
   Printformatgetvaluesortedset)rQ   itemsbufuse_yamlitemfmts         r   ConstructListr_   v   s    
#(dTh  
C53/__ULLN33 
 
 7
=
=E
=
JC6#e*-s<	r   c                 :    [        U [        R                  U5        g)z7Raises a ToolException with the given list of problems.N)RaiseExceptioncalliope_exceptionsToolException)problemserror_messages     r   RaiseToolExceptionrf      s    .<<mLr   c                     / nU  H  u  pEUR                  U5        M     U" [        U=(       d    S[        U5      5      5      e)z>Raises the provided exception with the given list of problems.zSome requests did not succeed:)appendr_   ParseErrors)rd   	exceptionre   errors_errors         r   ra   ra      sF    &ha
MM%  	ME%E')	* *r   c                 8   / nU  H  n[        US5      (       d  UR                  U5        M'  [        U5      (       a  UR                  [        U5      5        MS  [	        U5      (       a  UR                  U5        Mv  UR                  UR
                  5        M     U$ )z2Parses errors to prepare the right error contents.message)hasattrrh   IsQuotaExceededErrorCreateQuotaExceededMsgrT   ro   )rk   filtered_errorsrm   s      r   ri   ri      s~    /e5)$$U#	e	$	$3E:;	u		U#U]]+  
r   c                    [        U S5      (       a/  U R                  (       a  U R                  S   R                  (       d  U R                  $ U R                  S   R                  nSR	                  U R                  UR
                  UR                  UR                  5      n[        US5      (       a0  UR                  (       a  USR	                  UR                  S5      -  nUR                  (       aW  [        R                  " 5       n[        R                  " UR                  SUS9  US	R	                  UR                  5       5      -  n[        US5      (       a  UR                  (       a  US
-  nU$ US-  nU$ )z4Constructs message to show for quota exceeded error.errorDetailsr   z2{}
	metric name = {}
	limit name = {}
	limit = {}
futureLimitz(	future limit = {}
	rollout status = {}
zin progressrN   rO   z	dimensions = {}zThe future limit is the new default quota that will be available after a service rollout completes. For more about the rollout process, see the documentation: https://cloud.google.com/compute/docs/quota-rollout.z{Try your request in another zone, or view documentation on how to increase quotas: https://cloud.google.com/compute/quotas.)rp   ru   	quotaInforo   rV   
metricName	limitNamelimitrv   
dimensionsrR   rS   r
   rU   rW   )rm   detailsmsgdims       r   rr   rr      sA   
%
(
(",,==q!++'CJJmmW''):):GMM	# Wm$$)<)<9@@] C 
++-C7--v3?%%clln55CWm$$)<)<	?C 
*	 	EC 
*r   c                    U (       d  g[        U S   R                  5       5      n[        U5      n/ nU  H  nU(       a  UnO[        US5      (       a  SnOSnU(       a*  SR	                  UR                  5       [        Xg5      5      nOSR	                  UR                  5       5      nUR                  U5        M     [        XEUS9  g)z2Prompts the user to confirm deletion of resources.Nr   regionz[{0}] in [{1}]z[{0}])prompt_title)	r:   
CollectionrL   rp   rV   Namegetattrrh   PromptForDeletionHelper)	refs
scope_namer   r?   resource_nameprompt_listrefref_scope_namer]   s	            r   PromptForDeletionr      s    	
*47+=+=+?@-+M:-+c!n	h		nn$$SXXZ1MNd^^CHHJ'dt  -<Pr   c                     U=(       d    SR                  U 5      n[        X!5      n[        R                  " US9(       d  [        R
                  " S5      eg )Nz"The following {0} will be deleted:)ro   zDeletion aborted by user.)rV   r_   r	   PromptContinuerb   rc   )r   r   r   prompt_messages       r   r   r      sM     M6==mL  ;.		"	">	:

+
+,G
HH 
;r   c                     U (       d  gU [         R                  -  S:w  a9  [        R                  " SR	                  U [         R                  -  S-   5      5      eU [         R                  -  $ )z$Converts a disk size in bytes to GB.Nr   z;Disk size must be a multiple of 1 GB. Did you mean [{0}GB]?r0   )r   BYTES_IN_ONE_GBcompute_exceptionsArgumentErrorrV   sizes    r   	BytesToGbr      ^    		I%%%*

*
*E		111A5	68 8 
**	**r   c                     U (       d  gU [         R                  -  S:w  a9  [        R                  " SR	                  U [         R                  -  S-   5      5      eU [         R                  -  $ )z$Converts a disk size in bytes to MB.Nr   z;Disk size must be a multiple of 1 MB. Did you mean [{0}MB]?r0   )r   BYTES_IN_ONE_MBr   r   rV   r   s    r   	BytesToMbr      r   r   c                    U (       d  gU(       aM  [         R                  U;   d(  [         R                  U;   d  [         R                  U;   a  [         R                  nOVU(       a?  [         R
                  U;   d(  [         R                  U;   d  [         R                  U;   a  SnO[         R                  nX:  a  [        R                  " [        U5        gg)z=Writes a warning message if the given disk size is too small.Nr   )r   DISK_TYPE_PD_BALANCEDDISK_TYPE_PD_SSDDISK_TYPE_PD_EXTREMESSD_DISK_PERFORMANCE_WARNING_GBDISK_TYPE_HD_EXTREMEDISK_TYPE_HD_BALANCEDDISK_TYPE_HD_THROUGHPUT$STANDARD_DISK_PERFORMANCE_WARNING_GBr   warningWARN_IF_DISK_SIZE_IS_TOO_SMALL)size_gb	disk_typewarning_threshold_gbs      r   WarnIfDiskSizeIsTooSmallr     s    	
I33y@..);22i?$DDi44	A55B779D$II#KK& $r   c                     / nU  H*  u  p#UR                  [        R                  " U5      5        M,     [        R                  " [        SU5      5        g )NzSome requests did not succeed.)rh   six	text_typer   r   r_   )rd   rk   rl   ro   s       r   WarnIfPartialRequestFailr     s>    &ja
MM#--()  ++m<fEFr   c                     [         R                  " SU 5      nU(       d  gUR                  5        Vs/ s H  n[        U5      PM     nnUS   S:X  a  gU H  nUS:  d  US:  d  M    g   gs  snf )zAAccepts an ipv4 address in string form and returns True if valid.z,^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$Fr      T)rG   matchgroupsint)ipr   xoctetsns        r   IsValidIPV4r   #  sk    
((BB
G%	!LLN+NqCFN&+ AY!^a1uC  
 ,s   A+c                 p    [        U 5      (       d%  [        R                  " SR                  U 5      5      eU $ )z<Argparse argument type that checks for a valid ipv4 address.zinvalid ipv4 value: '{0}')r   argparseArgumentTypeErrorrV   values    r   IPV4Argumentr   6  /    	U		

$
$%@%G%G%N
OO	,r   c                     U R                  S5      n[        U5      S:w  a  gUS   US   p2[        U5      (       d  g S[        U5      s=:  =(       a    S:*  $ s  $ ! [         a     gf = f)z?Accepts an ipv4 range in string form and returns True if valid./   Fr   r0       )r7   rC   r   r   
ValueError)r   partsaddressmasks       r   IsValidIPV4Ranger   >  so    
++c
%Z1_(E!H4	W		s4yB	 s   A A 
A('A(c                 p    [        U 5      (       d%  [        R                  " SR                  U 5      5      eU $ )z:Argparse argument type that checks for a valid ipv4 range.zinvalid ipv4 range value: '{0}')r   r   r   rV   r   s    r   IPV4RangeArgumentr   N  s5    	%	 	 

$
$)007  
,r   c                 f     [         R                  " U 5        g! [         R                   a     gf = f)zAAccepts an ipv6 address in string form and returns True if valid.FT)ipaddrIPv6AddressAddressValueError)r   s    r   IsValidIPV6r   X  s4    
r 
 
	!	! s    00c                 p    [        U 5      (       d%  [        R                  " SR                  U 5      5      eU $ )z<Argparse argument type that checks for a valid ipv6 address.zinvalid ipv6 value: '{0}')r   r   r   rV   r   s    r   IPV6Argumentr   a  r   r   c                     [        U 5      (       d5  [        U 5      (       d%  [        R                  " SR	                  U 5      5      eU $ )zDArgparse argument type that checks for a valid ipv4 or ipv6 address.zinvalid ip value: '{0}')r   r   r   r   rV   r   s    r   
IPArgumentr   i  s9    	U		K$6$6

$
$%>%E%Ee%L
MM	,r   c                      S $ )Nc                     U S   $ )NselfLinkr   )r   s    r   <lambda> MakeGetUriFunc.<locals>.<lambda>r  s    1Z=r   r   r   r   r   MakeGetUriFuncr   q  s    	  r   c                 v   ^ ^^ U UU4S jnU" 5       u  pEU(       a  UTl         U" 5       u  peXF-  nU(       a  M  U$ )zReturns the paged results for request from client.

Args:
  client: The client object.
  request: The request.
  get_value_fn: Called to extract a value from an additionlProperties list
    item.

Returns:
  The list of request results.
c                     > TR                  T5      n / nU R                  R                   H  nUT" U5      -  nM     XR                  4$ N)AggregatedListrZ   additionalPropertiesnextPageToken)responserZ   r]   clientget_value_fnrequests      r   _GetNextListPage&GetListPager.<locals>._GetNextListPage  sJ    $$W-HE33|D!!e 4((((r   )	pageToken)r   r   r   r   resultsnext_page_tokenpages   ```    r   GetListPagerr   u  s@    ) ./''G,.DOG 	 
.r   c                     [        U S5      (       a1  U R                  S:X  d   U R                  S:X  d  U R                  S:X  a  gg)Ncode)ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILSZONE_RESOURCE_POOL_EXHAUSTEDQUOTA_EXCEEDEDTFrp   r   rm   s    r   rT   rT     sB     ::!LL::!??::!11	r   c                 F    [        U S5      =(       a    U R                  S:H  $ )Nr   r   r   r   s    r   rq   rq     s    			BEJJ2B$BBr   c                 x     U R                  S5      nSUR                  5       ;   $ ! [        [        4 a     gf = f)Nrm   r|   F)getkeysKeyErrorAttributeError)datarm   s     r   JsonErrorHasDetailsr     s=    HHWE

$$
N	# s   #& 99r   )NN)@r   
__future__r   r   r   r   rR   rG   googlecloudsdk.api_lib.computer   r   googlecloudsdk.callioperb   "googlecloudsdk.command_lib.computer   googlecloudsdk.corer   googlecloudsdk.core.consoler	   googlecloudsdk.core.resourcer
   r   r   COMPUTE_ALPHA_API_VERSIONCOMPUTE_BETA_API_VERSIONCOMPUTE_GA_API_VERSIONr   Errorr   r   r    r#   r&   r)   r,   r3   r:   r=   r@   rE   rL   r_   rf   ra   ri   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   rq   r   r   r   r   <module>r     sl   H &  '  	 	 4 5 E O # 2 9  
# !  D PJ,, P/z'' /+Z-- +$:## $?Z-- ?/)) //Z-- /%
%
%
$
<"&M
*FQ.I
+
+.G& !8Cr   