
    Q1                        d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl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dlZdZdZdZdZ G d de
j6                        Z G d de
j6                        Z G d de
j6                        Z G d de
j6                        Z G d de
j6                        Z  G d de
j6                        Z! G d de
j6                        Z"d Z#d Z$d Z%d  Z&d! Z'd" Z(d# Z)d:d$Z*d:d%Z+d& Z,d' Z-d;d(Z.d:d)Z/d* Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?y)<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                       e Zd ZdZy)InstanceNotReadyErrorzGThe user is attempting to perform an operation on a not-ready instance.N__name__
__module____qualname____doc__     +lib/googlecloudsdk/api_lib/compute/utils.pyr   r   -   s    Or   r   c                       e Zd ZdZy)InvalidUserErrorz&The user provided an invalid username.Nr   r   r   r   r   r   1       .r   r   c                       e Zd ZdZy)MissingDependencyErrorz"An external dependency is missing.Nr   r   r   r   r   r   5   s    *r   r   c                       e Zd ZdZy)TimeoutErrorzThe user command timed out.Nr   r   r   r   r   r   9   s    #r   r   c                       e Zd ZdZy)WrongInstanceTypeErrorz6The instance type is not appropriate for this command.Nr   r   r   r   r    r    =   s    >r   r    c                       e Zd ZdZy)ImageNotFoundErrorz&The image resource could not be found.Nr   r   r   r   r"   r"   A   r   r   r"   c                       e Zd ZdZy)IncorrectX509FormErrorz&The X509 should be in binary DER form.Nr   r   r   r   r$   r$   E   r   r   r$   c                 ,    | j                  dd      d   S )zDConverts zone name to region name: 'us-central1-a' -> 'us-central1'.-   r   )rsplit)	zone_names    r   ZoneNameToRegionNamer*   I   s    			#q	!!	$$r   c                 ,    | j                  dd      d   S )zEConverts a collection to a resource type: 'compute.disks' -> 'disks'..r'   split
collections    r   CollectionToResourceTyper1   N       			#q	!!	$$r   c                 ,    | j                  dd      d   S )z>Converts a collection to an api: 'compute.disks' -> 'compute'.r,   r'   r   r-   r/   s    r   _GetApiNameFromCollectionr4   S   r2   r   c                     d| z   S )z(Coverts a resource type to a collection.zcompute.r   )resource_types    r   GetApiCollectionr7   X   s    	m	##r   c                 N    | r"| j                  d      rd| t        d      d z   S | S )zDConverts gs:// to http:// if uri begins with gs:// else returns uri.zgs://zhttp://storage.googleapis.com/N)
startswithlen)uris    r   NormalizeGoogleStorageUrir<   ]   s+    S^^G$+c#g,-.@@@Jr   c                 h    t        j                  dd|       j                         j                         S )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   CamelCaseToOutputFriendlyrC   e   s)     

FF	+	1	1	3	9	9	;;r   c                    t        j                         }d}|D ]  }t        |      sd} n |rLd}t        j                  |||       | r dj                  | |j                               S |j                         S dj                  |       }t        j                  t        t        |            ||       |j                         S )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)rH   itemsbufuse_yamlitemfmts         r   ConstructListrV   v   s    
#(dTh  
C5#3/__UCLLN33 
 7
=
=E
=
JC6#e*-s<	r   c                 :    t        | t        j                  |       y)z7Raises a ToolException with the given list of problems.N)RaiseExceptioncalliope_exceptionsToolException)problemserror_messages     r   RaiseToolExceptionr]      s    .<<mLr   c                 z    g }| D ]  \  }}|j                  |         |t        |xs dt        |                  )z>Raises the provided exception with the given list of problems.zSome requests did not succeed:)appendrV   ParseErrors)r[   	exceptionr\   errors_errors         r   rX   rX      sH    &ha
MM%  	ME%E')	* *r   c                    g }| D ]~  }t        |d      s|j                  |       !t        |      r|j                  t        |             Gt	        |      r|j                  |       d|j                  |j
                          |S )z2Parses errors to prepare the right error contents.message)hasattrr_   IsQuotaExceededErrorCreateQuotaExceededMsgrK   rf   )rb   filtered_errorsrd   s      r   r`   r`      su    /e5)$U#	e	$3E:;	u	U#U]]+  
r   c                    t        | d      r%| j                  r| j                  d   j                  s| j                  S | j                  d   j                  }dj	                  | j                  |j
                  |j                  |j                        }t        |d      r+|j                  r|dj	                  |j                  d      z  }|j                  rXt        j                         }t        j                  |j                  d|       |d	j	                  |j                               z  }t        |d      r|j                  r|d
z  }|S |dz  }|S )z4Constructs message to show for quota exceeded error.errorDetailsr   z2{}
	metric name = {}
	limit name = {}
	limit = {}
futureLimitz(	future limit = {}
	rollout status = {}
zin progressrE   rF   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.)rg   rl   	quotaInforf   rM   
metricName	limitNamelimitrm   
dimensionsrI   rJ   r
   rL   rN   )rd   detailsmsgdims       r   ri   ri      s8   
%
(",,==q!++'CJJmmW''):):GMM	# Wm$)<)<9@@] C 
++-C7--v3?%%clln55CWm$)<)<	?C 
*	 	EC 
*r   c                 l   | syt        | d   j                               }t        |      }g }| D ]u  }|r|}nt        |d      rd}nd}|r+dj	                  |j                         t        ||            }ndj	                  |j                               }|j                  |       w t        |||       y)z2Prompts the user to confirm deletion of resources.Nr   regionz[{0}] in [{1}]z[{0}])prompt_title)	r1   
CollectionrC   rg   rM   Namegetattrr_   PromptForDeletionHelper)	refs
scope_namerx   r6   resource_nameprompt_listrefref_scope_namerT   s	            r   PromptForDeletionr      s    	
*47+=+=+?@-+M:-+c!n	h	nn$$SXXZn1MNd^^CHHJ'dt  -<Pr   c                     |xs dj                  |       }t        ||      }t        j                  |      st	        j
                  d      y )Nz"The following {0} will be deleted:)rf   zDeletion aborted by user.)rM   rV   r	   PromptContinuerY   rZ   )r   r   rx   prompt_messages       r   r|   r|      sO     M6==mL  {;.		"	">	:

+
+,G
HH 
;r   c                     | sy| t         j                  z  dk7  r8t        j                  dj	                  | t         j                  z  dz               | t         j                  z  S )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]?r'   )r   BYTES_IN_ONE_GBcompute_exceptionsArgumentErrorrM   sizes    r   	BytesToGbr      ^    		I%%%*

*
*E		111A5	68 8 
**	**r   c                     | sy| t         j                  z  dk7  r8t        j                  dj	                  | t         j                  z  dz               | t         j                  z  S )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]?r'   )r   BYTES_IN_ONE_MBr   r   rM   r   s    r   	BytesToMbr      r   r   c                 r   | sy|rGt         j                  |v s$t         j                  |v st         j                  |v rt         j                  }nK|r9t         j
                  |v s$t         j                  |v st         j                  |v rd}nt         j                  }| |k  rt        j                  t        |       yy)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                     g }| D ])  \  }}|j                  t        j                  |             + t        j                  t        d|             y )NzSome requests did not succeed.)r_   six	text_typer   r   rV   )r[   rb   rc   rf   s       r   WarnIfPartialRequestFailr     s@    &ja
MM#--()  ++m<fEFr   c                     t        j                  d|       }|sy|j                         D cg c]  }t        |       }}|d   dk(  ry|D ]  }|dk  s|dkD  s y yc c}w )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)r>   matchgroupsint)ipr   xoctetsns        r   IsValidIPV4r   #  sk    
((BB
G%	!LLN+NqCFN&+ AY!^a1uC  
 ,s   Ac                 d    t        |       s$t        j                  dj                  |             | S )z<Argparse argument type that checks for a valid ipv4 address.zinvalid ipv4 value: '{0}')r   argparseArgumentTypeErrorrM   values    r   IPV4Argumentr   6  ,    	U	

$
$%@%G%G%N
OO	,r   c                     | j                  d      }t        |      dk7  ry|d   |d   }}t        |      sy	 dt        |      cxk  xr dk  S c S # t        $ r Y yw xY w)z?Accepts an ipv4 range in string form and returns True if valid./   Fr   r'       )r.   r:   r   r   
ValueError)r   partsaddressmasks       r   IsValidIPV4Ranger   >  sk    
++c
%Z1_(E!H4'	W	s4yB	 s   A A 	AAc                 d    t        |       s$t        j                  dj                  |             | S )z:Argparse argument type that checks for a valid ipv4 range.zinvalid ipv4 range value: '{0}')r   r   r   rM   r   s    r   IPV4RangeArgumentr   N  s2    	%	 

$
$)007  
,r   c                 b    	 t        j                  |        y# t         j                  $ r Y yw xY w)zAAccepts an ipv6 address in string form and returns True if valid.FT)ipaddrIPv6AddressAddressValueError)r   s    r   IsValidIPV6r   X  s4    
r 
 
	!	! s    ..c                 d    t        |       s$t        j                  dj                  |             | S )z<Argparse argument type that checks for a valid ipv6 address.zinvalid ipv6 value: '{0}')r   r   r   rM   r   s    r   IPV6Argumentr   a  r   r   c                 z    t        |       s/t        |       s$t        j                  dj	                  |             | S )zDArgparse argument type that checks for a valid ipv4 or ipv6 address.zinvalid ip value: '{0}')r   r   r   r   rM   r   s    r   
IPArgumentr   i  s3    	U	K$6

$
$%>%E%Ee%L
MM	,r   c                      d S )Nc                     | d   S )NselfLinkr   )r   s    r   <lambda>z MakeGetUriFunc.<locals>.<lambda>r  s    1Z=r   r   r   r   r   MakeGetUriFuncr   q  s    	  r   c                 d      fd} |       \  }}|r|_          |       \  }}||z  }|r|S )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                      j                        } g }| j                  j                  D ]  }| |      z  } || j                  fS N)AggregatedListrQ   additionalPropertiesnextPageToken)responserQ   rT   clientget_value_fnrequests      r   _GetNextListPagez&GetListPager.<locals>._GetNextListPage  sL    $$W-HE33|D!!e 4(((((r   )	pageToken)r   r   r   r   resultsnext_page_tokenpages   ```    r   GetListPagerr   u  sD    ) ./'?'G,.D/tOG 	 
.r   c                 x    t        | d      r.| j                  dk(  s| j                  dk(  s| j                  dk(  ryy)Ncode)ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILSZONE_RESOURCE_POOL_EXHAUSTEDQUOTA_EXCEEDEDTFrg   r   rd   s    r   rK   rK     s=    ::!LL::!??::!11	r   c                 <    t        | d      xr | j                  dk(  S )Nr   r   r   r   s    r   rh   rh     s    			BEJJ2B$BBr   c                 t    	 | j                  d      }d|j                         v S # t        t        f$ r Y yw xY w)Nrd   rs   F)getkeysKeyErrorAttributeError)datard   s     r   JsonErrorHasDetailsr     s=    HHWE

$$
N	# s   "% 77r   )NN)@r   
__future__r   r   r   r   rI   r>   googlecloudsdk.api_lib.computer   r   googlecloudsdk.callioperY   "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$   r*   r1   r4   r7   r<   rC   rV   r]   rX   r`   ri   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   rh   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   