
    v                     n   d Z ddlmZ ddlmZ ddlm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ZddlZd
 Zd Zd Zd Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z# ejH                  d!g d"      Z%i d# e%d$g d%d&e
jL                  fd'e
jN                  fgd"      d( e%d)g d*d+e
jL                  fd,e
jL                  fgd"      d- e%d.g d/d0d1 fgd2d0g"      d3 e%d4d5d6e fd7gd8e
jN                  fgg d9"      d: e%d;g d<e
jN                  fgd"      d= e%d>g d?d@e
jL                  fdAe
jL                  fd+e
jL                  fgd"      dB e%dCg dDd+e
jL                  fgd"      dE e%dFd5dGdHefdIefdJefdKefgdLe
jL                  fgd"      dM e%dNd5dOdPdQdRefgd&e
jL                  fd,e
jN                  fgd"      dS e%dTd5dUefdVgg g "      dW e%dXd5dYgg d"      dZ e%d[g d\g d"      d] e%d^g d\g d"      d_ e%d`g dag d"      db e%dcd5ddefdedfdggg d"      dh e%dig djd+e
jL                  fdke(fgd"      dl e%dmg dnd+e
jL                  fdoe
jL                  fdpe
jL                  fgd"      i dq e%drd5dsdtefdudvdwdggdxe
jL                  fdye
jL                  fdze
jL                  fd+e
jL                  fgd"      d{ e%d|d5dtefd}d~gg d"      d e%dd5dsddefdfgd+e
jL                  fgd"      d e%dg dg d"      d e%dg g d"      d e%dd5dddefdgdgde
jN                  fgd"      d e%ddVdefdgdgde
jN                  fgd"      d e%d4d5d6e fd7gd8e
jN                  fgg d"      d e%dd5d edd      fd edd      fd edd      fd edd      fdefdefgde
jL                  fgd"      d e%dd5dGdde!fdgdLe
jL                  fgd"      d e%dg dde
jN                  fgd"      d e%dd5d~gg d"      d e%dg ddLe
jL                  fd&e
jL                  fgd"      d e%dd5dgde
jL                  fgd"      d e%dd5de"fdgde
jL                  fde
jL                  fgd"      d e%dd5ddde"fgde
jL                  fde
jL                  fgd"      d e%dg dde
jL                  fd+e
jL                  fgd"       e%dg d<e
jN                  fgd"       e%dd5dOdddefgde
jL                  fde
jL                  fde
jN                  fd&e
jL                  fgd"       e%dg dǢdLe
jL                  fd&e
jL                  fgd"       e%dg dɢg g "       e%dd5dOdefdefgd&e
jL                  fgd"       e%dg d̢d&e
jL                  fde
jL                  fgd"       e%dg dϢdLe
jL                  fd&e
jL                  fgd"      dМZ)e)jU                         Z+ e%d4d5d6e fd7gd8e
jN                  fgg dѢ"      e+d3<    e%dg dӢg g "      e+d<   e+jU                         Z, e%did5defdefdGddgdke(fgd"      e,dh<    e%dmd5defdefdddddgdoe
jL                  fdpe
jL                  fgd"      e,dl<   dބ Z- ejH                  d!g dߢ      Z.d Z/y)z4Annotates the resource types with extra information.    )absolute_import)division)unicode_literalsN)messages)instance_utils)path_simplifier)property_selectorc                    g }| j                  dg       D ]c  }|j                  d      }|s|j                  d      }|r)|D ]#  }|j                  dj                  ||             % S|j                  |       e dj                  |      S )z7Returns a compact string describing the firewall rules.allowed
IPProtocolportsz{0}:{1},)getappendformatjoin)firewallrulesr   protocolport_ranges
port_ranges         4lib/googlecloudsdk/api_lib/compute/resource_specs.py_FirewallRulesToCellr       s    
%i,g{{<(H++g&K#*Y%%h
;< $ ll8 - 
%    c                 R    dj                  d | j                  dg       D              S )z@Comma-joins the names of health checks of the given target pool.r   c              3   F   K   | ]  }t        j                  |        y wNr   Name).0checks     r   	<genexpr>z0_TargetPoolHealthChecksToCell.<locals>.<genexpr>4   s#      75 38/&&u-5   !healthChecksr   r   )target_pools    r   _TargetPoolHealthChecksToCellr'   2   s+    	 7//."57 
7 7r   c                 D    dj                  | j                  dg             S )z9Comma-joins the source ranges of the given firewall rule.r   sourceRangesr%   r   s    r   _FirewallSourceRangesToCellr+   8   s    	(,,~r2	33r   c                 D    dj                  | j                  dg             S )z7Comma-joins the source tags of the given firewall rule.r   
sourceTagsr%   r*   s    r   _FirewallSourceTagsToCellr.   =       	(,,|R0	11r   c                 D    dj                  | j                  dg             S )z7Comma-joins the target tags of the given firewall rule.r   
targetTagsr%   r*   s    r   _FirewallTargetTagsToCellr2   B   r/   r   c                 R    | j                  dd      }||S | j                  dd      S )z?Gets the API-level target or backend-service of the given rule.backendServiceNtargetr   )forwarding_rulebackend_services     r   _ForwardingRuleTargetr9   G   s4    #''(8$?/ x..r   c                     | j                  dd      }|r0dj                  | j                  d      |j                  d            S | j                  d      S )zGReturns status of a machine with deprecation information if applicable.
deprecated z	{0} ({1})statusstate)r   r   zone_or_regionr;   s     r   _StatusToCellrA   P   sV    !!,3*n00:(nnW57 7 h''r   c                 N    | j                  dd      }|r|j                  d      S y)z=Returns the turndown timestamp of a deprecated machine or ''.r;   r<   deletedr6   r?   s     r   _DeprecatedDateTimeToCellrD   Z   s)    !!,3*>>)$$r   Tc                       fd}|S )zBReturns a function that can format the given quota as usage/limit.c           	      L   | j                  dg       D ]  }|j                  d      k7  rrDdj                  t        |j                  d            t        |j                  d                  c S dj                  |j                  d      |j                  d            c S  y)z,Formats the metric from the parent function.quotasmetricz	{0:6}/{1}usagelimitz{0:7.2f}/{1:.2f}r<   )r   r   int)regionquota
is_integerrH   s     r   QuotaToCellz!_QuotaToCell.<locals>.QuotaToCellf   s    Hb)	8		&	!!		'"#		'"#% 	% "((IIgIIg  	  * r    )rH   rN   rO   s   `` r   _QuotaToCellrQ   c   s    " 
r   c                 t    d| v rt        j                  | d         S d| v rt        j                  | d         S y)z;Returns a location name, could be region name or zone name.zonerL   Nr   instance_groups    r   _LocationNamerV   z   sA    ~v 677>!x 899r   c                     d| v ryd| v ryy)z7Returns a location scope type, could be region or zone.rS   rL   NrP   rT   s    r   _LocationScopeTyperX      s    ~>!r   c                 d    | j                  d      }|rdj                  t        |      dz        S y)z3Returns the memory of the given machine type in GB.memoryMbz{0:5.2f}   r<   )r   r   float)machine_typememorys     r   _MachineTypeMemoryToCellr_      s2    J'&U6]U233r   c                     t        j                  |       \  }}}|r+|r)|r'dj                  |dz        }dj                  |||      } | S )a-  Checks for custom machine type and modifies output.

  Args:
    mt: machine type to be formatted

  Returns:
    If mt was a custom type, then it will be formatted into the desired custom
      machine type output. Otherwise, it is returned unchanged.

  Helper function for _MachineTypeNameToCell
  z{0:.2f}r[   zcustom ({0}, {1} vCPU, {2} GiB))r   GetCpuRamVmFamilyFromCustomNamer   )mtcustom_family
custom_cpu
custom_ramcustom_ram_gbs        r   _FormatCustomMachineTypeNamerg      sV     2226 (-ZJ=$$Z5%9:M	*	1	1-2?
AB	)r   c                 b    | j                  d|       j                  d      }|rt        |      S |S )aj  Returns the formatted name of the given machine type.

  Most machine types will be untouched, with the exception of the custom machine
  type. This modifies the 'custom-N-M' custom machine types with
  'custom (N vCPU, M GiB)'.

  For example, given the following custom machine_type:

    custom-2-3500

  This function will return:

    custom (2 vCPU, 3.41 GiB)

  in the MACHINE_TYPE field when listing out the current instances.

  Args:
    machine_type: The machine type of the given instance

  Returns:
    A formatted version of the given custom machine type (as shown in example
    in docstring above).
  
propertiesmachineType)r   rg   )r]   rb   s     r   _MachineTypeNameToCellrk      s4    0 l377F"'++	)r   c                     d|v rKd|v rG| syd| vry| d   j                  d      }|d   }d|vryt        |      }||d<   dj                  |      S y)a=  Formats a custom machine type when 'instances describe' is called.

  Args:
    resources: dict of resources available for the instance in question
    com_path: command path of the calling command

  Returns:
    If input is a custom type, returns the formatted custom machine type.
      Otherwise, returns None.
  	instancesdescribeNrj   /custom)splitrg   r   )	resourcescom_pathmt_splitlistrb   formatted_mts        r   FormatDescribeMachineTypeNamerw      st     XJ($:I%]+11#6L	b	Br/3L#L88L!!r   c                     | j                  d      dk(  r7| j                  d      xs$ t        j                  j                  j                  S y)z6Returns the HTTP response code of the given operation.r=   DONEhttpErrorStatusCoder<   )r   sixmoveshttp_clientOK)	operations    r   _OperationHttpStatusToCellr      s;    ]]8&==./K3993H3H3K3KKr   c                 x    | j                  d      }|r't        j                  |      j                  d      d   S y)z/Returns the project name of the given resource.selfLinkro   r   r<   )r   r   ProjectSuffixrr   )resource	self_links     r   _ProjectToCellr      s7    ll:&)((399#>qAAr   c                 @    | j                  d      }|rt        |      S y)Nmembers0)r   len)groupr   s     r   _MembersToCellr      s     IIi 'w<	r   c                 R    dj                  d | j                  dg       D              S )z.Comma-joins the names of the backend services.r   c              3   >   K   | ]  }|j                  d         yw)r   Nr6   )r    backends     r   r"   z"_BackendsToCell.<locals>.<genexpr>  s"      F!Dg ++g&!Ds   backendsr%   )r8   s    r   _BackendsToCellr      s1    	 F!0!4!4Z!DF 
F Fr   c                    | j                  d      r$t        j                  | j                  d            S | j                  d      r$t        j                  | j                  d            S | j                  d      r| j                  d      S | j                  d      r$t        j                  | j                  d            S | j                  d      r| j                  d      S y)z-Returns the next hop value in a compact form.nextHopInstancenextHopGateway	nextHopIpnextHopVpnTunnelnextHopPeeringr<   )r   r   ScopedSuffix)routes    r   _RoutesNextHopToCellr     s    
YY !''		2C(DEEyy!"''		2B(CDDyy99[!!yy#$''		2D(EFFyy!"99%&&r   c                 R    dj                  d | j                  dg       D              S )zDJoins the names of ssl certificates of the given HTTPS or SSL proxy.r   c              3   F   K   | ]  }t        j                  |        y wr   r   )r    certs     r   r"   z4_TargetProxySslCertificatesToCell.<locals>.<genexpr>  s#      ;9 26/&&t,9r#   sslCertificatesr%   )target_proxys    r   !_TargetProxySslCertificatesToCellr     s.    	 ;""#4b9; 
; ;r   c              #   z  K   t        | j                         d       D ]  }t        |t        j                        rPt        |j                        D ]7  }|j                  r|j                  dz   |z    $|j                  dz   |z    9 m|j                  r|j                  dz    |j                    yw)a  Flattens the fields in a protocol buffer definition.

  For example, given the following definition:

    message Point {
      required int32 x = 1;
      required int32 y = 2;
      optional string label = 3;
    }

    message Polyline {
      repeated Point point = 1;
      optional string label = 2;
    }

  a call to this function with the Polyline class would produce:

    ['label',
     'point[].label',
     'point[].x',
     'point[].y']

  Args:
    message_class: A class that inherits from protorpc.self.messages.Message
        and defines a protocol buffer.

  Yields:
    The flattened fields, in non-decreasing order.
  c                     | j                   S r   )name)fields    r   <lambda>z-_ProtobufDefinitionToFields.<locals>.<lambda>9  s    EJJr   )keyz[]..z[]N)	sorted
all_fields
isinstancer   MessageField_ProtobufDefinitionToFieldstyperepeatedr   )message_classr   	remainders      r   r   r     s     < m..06NOe%../25::>)>>

U"Y.
.

S 9,
,	 ? 
jj4jj Ps   B9B;Spec)message_class_name
table_colstransformations	editables	addressesAddress)NAMEr   REGIONrL   )ADDRESSaddressSTATUSr=   rL   zusers[]autoscalers
Autoscaler)r   )TARGETr5   )POLICYautoscalingPolicyrS   r5   backendBucketsBackendBucket)r   )GCS_BUCKET_NAME
bucketName)
ENABLE_CDN	enableCdnr   c                 4    t        |       j                         S r   )strlower)xs    r   r   r   q  s    CFLLNr   bucketNamedescriptionbackendServicesBackendServicer   BACKENDS)PROTOCOLr   zbackends[].group)r   description	enableCDNr$   iap.enablediap.oauth2ClientIdiap.oauth2ClientSecretportportNamer   
timeoutSecbackendServiceGroupHealthBackendServiceGroupHealthzhealthStatus[].instancedisksDisk)r   ZONErS   )SIZE_GBsizeGb)TYPEr   r   sourceSnapshotr   	diskTypesDiskType)r   r   )VALID_DISK_SIZESvalidDiskSize	firewallsFirewallNETWORKnetwork
SRC_RANGESRULESSRC_TAGSTARGET_TAGSr   forwardingRulesForwardingRuler   )
IP_ADDRESS	IPAddress)IP_PROTOCOLr   r   groupsGroupNUM_MEMBERSDESCRIPTIONr   r$   HealthCheck)r   r   httpHealthChecksHttpHealthCheck)r   )HOSThost)PORTr   )REQUEST_PATHrequestPathhttpsHealthChecksHttpsHealthCheckiapBackendServiceIAP)r   )ENABLEDenabled)OAUTH2_CLIENT_IDoauth2ClientId)OAUTH2_CLIENT_SECREToauth2ClientSecret)OAUTH2_CLIENT_SECRET_SHA256oauth2ClientSecretSha256imagesImagePROJECT)FAMILYfamily)
DEPRECATEDzdeprecated.stater   instanceGroupsInstanceGroup)r   r   r   MANAGED	isManaged	INSTANCESsizer  instanceGroupManagersInstanceGroupManager)r   r   BASE_INSTANCE_NAMEbaseInstanceNameSIZEr  TARGET_SIZE
targetSizeINSTANCE_TEMPLATEinstanceTemplate
AUTOSCALED
autoscaledinstanceGroupr+  rm   Instancer   MACHINE_TYPE)PREEMPTIBLEzscheduling.preemptible)INTERNAL_IPz.networkInterfaces[].networkIP.notnull().list())EXTERNAL_IPz;networkInterfaces[].accessConfigs[0].natIP.notnull().list()zdisks[].sourcerj   znetworkInterfaces[].networkinstanceTemplatesInstanceTemplate)r2  z!properties.scheduling.preemptible)CREATION_TIMESTAMPcreationTimestampmachineTypesMachineType)CPUS	guestCpus	MEMORY_GBnetworksNetwork)r   )MODEx_gcloud_mode)
IPV4_RANGE	IPv4Range)GATEWAY_IPV4gatewayIPv4projectsProject
operations	Operation)r   operationType)r   
targetLinkHTTP_STATUS)	TIMESTAMP
insertTimerK  invalidationsregionBackendServices)r   r   r   r$   r   r   r   r   regionsRegionr;  F)rN   DISKS_GBDISKS_TOTAL_GB	ADDRESSESIN_USE_ADDRESSESRESERVED_ADDRESSESSTATIC_ADDRESSESr   TURNDOWN_DATEzzones[]routesRoute)
DEST_RANGE	destRangeNEXT_HOP)PRIORITYpriority	snapshotsSnapshot)r   )DISK_SIZE_GB
diskSizeGb)SRC_DISK
sourceDiskr   rf  r   subnetworks
Subnetwork)r   r   r   )RANGEipCidrRangetargetHttpProxiesTargetHttpProxy)URL_MAPurlMaprn  targetHttpsProxiesTargetHttpsProxySSL_CERTIFICATESzsslCertificates[]targetSslProxiesTargetSslProxy)PROXY_HEADERproxyHeader)SERVICEservicerw  targetInstancesTargetInstance)r   r   )INSTANCEinstance)
NAT_POLICY	natPolicyr{  TargetPoolInstanceHealth
TargetPool)SESSION_AFFINITYsessionAffinity)BACKUP
backupPoolHEALTH_CHECKSr  zhealthChecks[]zinstances[]TargetVpnGateway)r   r   r   User)r   )OWNERownerr   Zone	VpnTunnel)r   r   )GATEWAYtargetVpnGateway)PEER_ADDRESSpeerIpr  Router)r   r   r   )targetPoolInstanceHealthtargetPoolstargetVpnGatewaysuserszones
vpnTunnelsrouters)r   r   r   r  affinityCookieTTLr$   r   r   r   r   r   r   r   
Commitment)r   )ENDSendTimestampr   r   commitmentsLOCATIONSCOPEr  r  r!  r$  r&  r)  r,  c                 B    | dk(  s| dk(  rt         S d| v rt        S t        S )a\  Get Specs for the given API version.

  This currently always returns _SPECS_V1, but is left here for the future,
  as a pattern for providing different specs for different versions.

  Args:
    api_version: A string identifying the API version, e.g. 'v1'.

  Returns:
    A map associating each message class name with an _InternalSpec object.
  v1v2beta1alpha)	_SPECS_V1_SPECS_ALPHA_SPECS_BETA)api_versions    r   _GetSpecsForVersionr    s-     DK94	r   r   fieldsr   r   r   c                    t        |      }| |vrt        d| d|d      ||    }g }|j                  D ]~  \  }}t        |t        j
                        r'|j                  |t        j                  |      f       Gt        |      r|j                  ||f       ft        dj                  |             t        ||j                        }t        t        |            }t!        ||||j"                  |j$                        S )z+Returns a Spec for the given resource type."z"" not found in Specs for version "z5expected function or property in table_cols list: {0}r  )r  KeyErrorr   r   r{   string_typesr   r	   PropertyGettercallable
ValueErrorr   getattrr   listr   r   r   r   )	resource_typemessage_classesr  specr   r   actionr   r  s	            r   GetSpecr    s    	[	)$$
!;0 1 1 
m	$*ooldF&#**+0??GHI	&	v'Nt& & & /4+B+BC-+M:;&	M#"22	
( (r   )T)0__doc__
__future__r   r   r   collectionsapitools.base.protorpcliter   googlecloudsdk.api_lib.computer   r   r	   r{   six.moves.http_clientr   r'   r+   r.   r2   r9   rA   rD   rQ   rV   rX   r_   rg   rk   rw   r   r   r   r   r   r   r   
namedtuple_InternalSpecr   r   r   r  copyr  r  r  r   r  rP   r   r   <module>r     s~   ; &  '  / 9 : < 
 $74
2
2
/(.,<6F ;)X '&&
HJR	$
 ++,445
 R	  ='
 _))*++,
 !R	< m*
 23

=R	\ }+)$
  !=!=>

]R	N  6 '(D(DE
 "OR	b ]!
 334_))*_))*

 cR	D %
 _))*
 ER	^ %"67*+2356
 ,,-
 _R	~ }+ '),-
 ++,334
 R	^ m"N+*

 	_R	t M( 
 uR	H ,
IR	b -
cR	| 
=.
 }R	V m"' . 
 WR	p m*
 _))*SM
 qR	P ]1
 _))*o223!5!56

 !QR	v %345ML 	
 334O001*O,@,@A_))*	
 %wR	` -34@7	
 
aR	x M(!23.
 _))*
 yR	V	 $
 
W	R	n	 $o	R	B
 -&%$67 '
 ?778
 C
R	b
 ]&*67 '	
 ?778
 c
R	~
 ]+)$
  !=!=>
	

R	j }#\&U;<&64HI,'9dKL!,>@}%78	
 ,,-
 kR	N m""'-.$
 ,,-
 OR	l %
 ?778
 mR	H }$7
 IR	\ ='
 ,,-++,
 ]R	z ,!

 ++,
 
{R	R --!BC!
 !/"6"67++,
 SR	n ++"!BC	
 !/"6"67,,-
 oR	L }+
 --._))*
 MR	j !.5 '(D(DE
 ! !' 3$;<
 ?//0334O889++,	
 $ '-
 ,,-++,.  !

 	 ! }%78	
 ++,
   &
 ++,!5!568  #
 ,,-++,
 KR		j nn!.'	_%  
_99:" 2 +# 	M  !!.&	]#	$%  
 "  )6-	]#	$%2%1$	 
/../	_112 !)$ %(& {
MO
(r   